Bash条件判断逻辑疑问:false被判定为真、命令退出码如何正确校验
核心问题解答
1. 为什么false在[[ ]]条件中会被判定为真?
[[ ]]是Bash内置的条件表达式关键字,当你在其中直接写true、false这类内容时,它会被识别为普通非空字符串处理。[[ ]]的判断规则里,只要传入的字符串不为空,就会判定为真,和字符串本身的内容是true还是false没有关系。
你写的[[ false ]]本质是在判断“false这个字符串是否非空”,结果当然为真。
2. [[ ]]条件判断是否不会校验命令的退出码?
是的,[[ ]]本身不会处理命令的退出码:
- 你把命令放在
$()里传入[[ ]]时,$()会替换为命令的标准输出内容,而非退出码。 - 你之前用
grep -q时,-q参数会禁止grep输出任何内容,所以$(grep -q sure /tmp/myfile)得到的是空字符串,[[ 空字符串 ]]判定为假,才会输出wtf! not found,和grep本身的退出码完全无关。
正确实现方式
Bash的if语法本身就支持直接跟命令,默认就以命令的退出码作为判断依据:退出码0判定为真,非0判定为假,完全不需要套[[ ]],也不需要手动判断$?。
你要的grep判断可以直接写成:
if grep -q sure /tmp/myfile ; then echo "Found!" ; else echo "wtf! not found" ; fi
对应的true/false测试用正确写法也符合预期:
# 输出 true -> expected if true ; then echo "true -> expected" ; else echo "true -> unexpected" ; fi # 输出 false -> expected if false ; then echo "false -> unexpected" ; else echo "false -> expected" ; fi
内容的提问来源于stack exchange,提问作者DingDong
相关产品推荐
相关产品推荐

