为何Bash中`if [ false ]`、`if [[ false ]]`为真,`if false`却为假?
Bash中
[ false ]与false在if条件中的差异解析 你遇到的问题本质是把字符串"false"和Bash内置命令false搞混了,[ ]/[[ ]]与直接写命令在if里的判定逻辑完全不同:
1. if [ false ]和if [[ false ]]的判定逻辑
[是Bash内置命令test的简写,[[ ]]是Bash的扩展条件表达式,两者对非空字符串的判定规则一致:只要括号内内容不是空字符串,就会返回"真"(退出状态0)。- 这里的
false是普通非空字符串,不是布尔值,所以[ false ]/[[ false ]]都会返回真,触发then分支的echo hello。 - 你补充测试的
[[ "$test" ]]同理,$test的值是字符串"false",非空,所以判定为真,依然输出hello。
2. if false; then的判定逻辑
- 当
if后直接跟false时,这里的false是Bash的内置命令,该命令执行后会返回退出状态码1(代表"假")。 if语句的判定依据是后续命令的退出状态码:状态码0为真,非0为假。因此false命令返回1时,then分支不会执行,也就不会输出hello。
额外补充:在[ ]/[[ ]]里正确判断布尔值
如果要在条件表达式里判断变量是否代表"假",不能直接写变量名,得用字符串比较:
test=false if [[ "$test" == "false" ]]; then echo "this won't print" else echo hello fi
或者直接调用命令判断退出状态:
test=false if ! $test; then echo "this will print" fi
内容的提问来源于stack exchange,提问作者notacorn
相关产品推荐
相关产品推荐

