一尘不染

了解Bash短路

linux

首先,我不是Bash专业人士。几个月前,我发现如果同时使用花括号&&||短路运算符,那么如果第一个语句以真实值退出,则如果true块中的最后一个语句退出非零,则fail块也将被执行。像这样:

returnNumber 0 && {
    echo 'OK'
    returnNumber 1
} || {
    echo 'NG'
}

将输出:

OK
NG

因此,我为此寻找了最简单的解决方案,并提出了以下解决方案:

returnNumber 0 && {
    echo 'OK'
    returnNumber 1
    :
} || {
    echo 'NG'
}

我知道,省略内置的冒号很容易,但这是否是解决方法的正确方法?


阅读 249

收藏
2020-06-07

共1个答案

一尘不染

这实际上是一个非常常见的Bash陷阱。这
不是 错误。

returnNumber 0计算结果为true,因此也对第二个块(由逻辑和联接&&)也进行了计算,以确保的结果first && second仍然为true。
第二个块输出,OK但求值为假,因此现在的结果first && second为假。这意味着还必须对第三部分(由逻辑或相连||)进行评估,并使其NG显示出来。


而不是依赖于&&||,您应该使用以下if语句:

if returnNumber 0; then
    echo 'OK'
    returnNumber 1
else
    echo 'NG'
fi

tl; dr:x && y || zy可以返回非零退出状态时不使用。

2020-06-07