Bash 条件语句

Jon*_*Doe 2 scripting bash

bash 脚本中使用的三种条件语句格式是什么?

int*_*ted 6

bash 手册相关部分列出了 5 种可用于条件评估的不同结构。其中ifcase、 和[[ .. ]]结构可能是现实世界代码中最常用的(( .. ))结构,尽管该结构在执行复杂计数或其他数值运算的脚本中会经常使用。

但是他们没有提到在 bash 中用于分支的另一种非常常见的形式,例如,它只是结合短路评估来执行命令

grep -q needle haystack.txt && echo "Needle located!" || echo "No dice or needles.";
Run Code Online (Sandbox Code Playgroud)

&&and||是逻辑运算符:分别是“and”和“or”。

这实际上与

if grep -q needle haystack.txt; then echo "yea"; else echo "nay"; fi;
Run Code Online (Sandbox Code Playgroud)

但工作方式不同:在第一种形式中,条件逻辑实际上是代码实际明确目标的副作用,至少在表面上是评估逻辑运算符。这种构造在 C 和 JavaScript 代码中也很常见。

它通过走捷径来工作:表达式的部分,例如x && y || z,从左到右计算。如果逻辑和的左侧,例如xin x && y,评估为假,bash则不会费心评估该y部分,因为此时它已经知道这x && y是假的。

逻辑 ors 反之亦然:true || z无论 z 结果如何,总是求值为真。

所以如果结果grep是假的,bash可以先跳过那个echo,因为表达式的那部分不可能是真的。所以它移动到第二个echo。另一方面,如果 grep 为真,echo则执行第一个(导致这些词被回显……)。到这里bash就大功告成了,因为无论 右边的值是多少||,表达式的结果仍然是真的。

要了解 bash 处理条件的方式,最好在命令行上进行一些实验。命令

echo $?;
Run Code Online (Sandbox Code Playgroud)

将回显上一条语句的返回码。这是一个错误代码,因此0表示真,非零值表示假。一开始有点混乱,但你习惯了。

所以你可以做,例如

$ (( 1 + 2 == 3 )); echo $?
0
$ (( 1 + 2 == 4 )); echo $?
1
Run Code Online (Sandbox Code Playgroud)

并对该[[ .. ]]构造执行类似的测试,以了解这些基本构建块。完成后,转到if然后进行case陈述。

至于你的问题的答案,我认为这在很大程度上取决于它被问到的上下文。但是对各种选项有一个很好的理解应该会帮助你弄清楚他们在那里寻找什么。