Bash中if语句为何将未定义变量判定为真?原因是什么
异常行为的产生原因
这个反直觉的结果是Shell的参数展开规则、if语句执行逻辑共同作用的结果:
- 首先,当
CONDITION变量没有被赋值时,Shell执行到if $CONDITION这一行时,会先做参数展开,把$CONDITION替换成空字符串。 - 其次要明确:Shell的
if关键字后面从来不是直接接布尔表达式,而是接一条可执行命令。Shell会运行这条命令,拿到命令的退出码:退出码为0就进入then分支,退出码非0就进入else分支。 - 最后,当参数展开完成后,if后面没有任何实际要执行的命令,按照Shell的执行规则,这种空的简单命令执行后的退出码固定为
0(代表执行成功),因此脚本会直接进入then分支打印"True"。
额外说明:你可能会好奇为什么给
CONDITION赋值false时能正常打印"False"——本质是因为true和false本身就是Shell的内置命令:true命令执行后永远返回退出码0,false命令执行后永远返回退出码1,并不是Shell原生支持布尔类型的变量判断。
符合预期的正确写法
如果要实现变量控制的布尔判断,不要直接把变量放在if后面当命令执行,应该用显式的字符串比较逻辑,同时给变量加引号避免空值展开导致的异常:
# 该写法在CONDITION未设置、为空、值不为true时,都会走else分支打印False,符合常规预期 if [ "$CONDITION" = "true" ]; then echo "True" else echo "False" fi
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

