Bash条件构造异常:if语句执行结果不符合预期
Bash中
[[ ... ]]条件表达式与普通命令列表的行为差异 你遇到的问题核心是没搞清楚[[ ... ]]和普通命令列表的本质区别:
首先,
if后面直接跟命令列表(比如if /usr/bin/false && 0)时,是依次执行命令,用命令的退出状态判断:/usr/bin/false退出状态为1,&&会短路后面的0,整个列表退出状态是1,所以if不会执行then块,这和你理解的man bash说明一致。但
[[ ... ]]是Bash提供的条件表达式结构,内部语法规则和外部命令列表完全不同:- 在
[[ ]]里写/usr/bin/false时,Bash不是去执行这个命令,而是把它当作非空字符串判断——非空字符串在条件表达式里会被视为“真”(退出状态0)。 - 里面的
&&也不是命令连接符,而是条件表达式的逻辑与运算符,连接前后两个条件判断。后面的0同样是一个非空字符串,也被视为“真”。 - 所以整个
[[ /usr/bin/false && 0 ]]的结果是“真”,退出状态为0,if自然会执行then块输出success。
- 在
如果你的需求是判断/usr/bin/false命令的执行结果(退出状态为1),正确写法有两种:
- 直接用命令列表,不用
[[ ]]:
此时if /usr/bin/false && 0; then echo success; fi/usr/bin/false退出状态1,&&短路,整个列表退出状态1,不会输出success。 - 要是一定要用
[[ ]],需要显式执行命令并判断其退出状态:
或者更简洁的写法(直接用命令退出状态,无需if [[ ! $(/usr/bin/false; echo $?) -eq 0 ]]; then echo command failed; fi[[ ]]):if ! /usr/bin/false; then echo command failed; fi
内容的提问来源于stack exchange,提问作者Boolean_Type
相关产品推荐
相关产品推荐

