Shell中true -a false和false -a true返回值不同原因及逻辑与运算用法
现象根本原因
出现这个结果的核心是混淆了Shell中不同层级的语法规则,三个核心认知误区:
true和false是Shell内置命令,不是布尔常量
这两个命令的行为是固定的:true执行后永远返回退出码0(Shell中代表逻辑真),false执行后永远返回退出码1(Shell中代表逻辑假),二者都会忽略传入的所有参数。
直接执行true -a false时,Shell会把-a和false当成传给true命令的普通字符串参数,不会解析成逻辑与操作,true直接返回0,所以$?输出0;同理执行false -a true时,Shell把-a和true当参数传给false,false直接返回1,所以$?输出1,完全和逻辑与运算无关。-a的作用域有严格限制-a是test命令(别名是[)的内部逻辑与操作符,只能写在test/[/[[的判断结构内部,不能直接放在两个独立命令之间当全局逻辑与用。- 测试中的赋值写法存在语法错误
Shell变量赋值要求=两边绝对不能有空格,测试中写的a=[ true -a false ]会被Shell解析为:执行名为a=[的命令,传入true、-a、false、]四个参数,根本不是在做变量赋值和逻辑运算,两次输出true是语法错误导致的异常结果,没有参考意义。
另外补充:&&是Shell语法层面的命令连接符,属于短路逻辑与,规则是前一个命令返回退出码0时,才会执行后一个命令,整体返回最后一个执行的命令的退出码;如果前一个命令返回非0,直接短路返回前一个命令的退出码,它和作为命令内部参数的-a完全不是一个层级的东西。
正确的逻辑与实现写法
根据使用场景选对应写法即可:
- 连接两个独立命令做短路逻辑与:直接用
&&# 前真后假,整体返回假(退出码1) true && false echo $? # 输出1 # 前假触发短路,整体返回假(退出码1) false && true echo $? # 输出1 - 做条件判断的逻辑与:推荐用
[[ ]]结构搭配&&,避免[ ]中-a的优先级歧义# 判断两个数值条件同时成立,不成立返回1 [[ 1 -gt 0 && 2 -gt 3 ]] echo $? # 输出1 # 如果一定要用[ ]和-a,注意[ 后、]前必须加空格 [ 1 -gt 0 -a 2 -gt 3 ] echo $? # 输出1 - 将逻辑与结果赋值给变量:通过短路规则配合赋值即可
true && false && res=true || res=false echo $res # 输出false false && true && res=true || res=false echo $res # 输出false
内容的提问来源于stack exchange,提问作者romlym
相关产品推荐
相关产品推荐

