首先,我不是Bash专业人士。几个月前,我发现如果同时使用花括号&&和||短路运算符,那么如果第一个语句以真实值退出,则如果true块中的最后一个语句退出非零,则fail块也将被执行。像这样:
&&
||
returnNumber 0 && { echo 'OK' returnNumber 1 } || { echo 'NG' }
将输出:
OK NG
因此,我为此寻找了最简单的解决方案,并提出了以下解决方案:
returnNumber 0 && { echo 'OK' returnNumber 1 : } || { echo 'NG' }
我知道,省略内置的冒号很容易,但这是否是解决方法的正确方法?
这实际上是一个非常常见的Bash陷阱。这 不是 错误。
returnNumber 0计算结果为true,因此也对第二个块(由逻辑和联接&&)也进行了计算,以确保的结果first && second仍然为true。 第二个块输出,OK但求值为假,因此现在的结果first && second为假。这意味着还必须对第三部分(由逻辑或相连||)进行评估,并使其NG显示出来。
returnNumber 0
first && second
OK
NG
而不是依赖于&&和||,您应该使用以下if语句:
if
if returnNumber 0; then echo 'OK' returnNumber 1 else echo 'NG' fi
tl; dr:x && y || z在y可以返回非零退出状态时不使用。
x && y || z
y