bash 脚本中使用的条件语句有哪三种格式?
答案1
这bash 手册的相关部分列出了 5 种可用于条件评估的不同构造。其中,if
、case
和[[ .. ]]
构造可能是实际代码中最常用的,尽管该(( .. ))
构造会在执行复杂计数或其他数值运算的脚本中频繁使用。
但他们没有提到 bash 中用于分支的另一种非常常见的形式,即仅结合短路评估来执行命令,例如
grep -q needle haystack.txt && echo "Needle located!" || echo "No dice or needles.";
&&
and||
是逻辑运算符:分别为“and”和“or”。
这实际上与
if grep -q needle haystack.txt; then echo "yea"; else echo "nay"; fi;
但工作方式不同:在第一种形式中,条件逻辑实际上是代码实际显式目标的副作用,至少表面上是评估逻辑运算符。这种构造在 C 和 JavaScript 代码中也很常见。
它通过采取捷径来工作:表达式的各个部分,例如x && y || z
,从左到右进行计算。如果逻辑 and 的左侧(例如x
in x && y
)评估为 false,bash
则不必费心评估该y
部分,因为此时它已经知道这x && y
是 false。
对于逻辑或而言,反之亦然:true || z
无论 z 结果是什么,其计算结果始终为 true。
因此,如果grep
结果为假,bash
可以先跳过它echo
,因为表达式的该部分不可能为真。所以它继续到第二个echo
。另一方面,如果 grep 为真,则echo
执行第一个(导致这些单词被回显......)。此时bash
已完成,因为无论 右侧的值是什么||
,表达式的结果仍然为 true。
要了解 bash 使用条件的方式,最好在命令行上进行一些实验。命令
echo $?;
将回响返回码之前的声明。这是一个错误代码,因此0
表示 true,非零值表示 false。一开始有点混乱,但你就会习惯了。
所以你可以这样做,例如
$ (( 1 + 2 == 3 )); echo $?
0
$ (( 1 + 2 == 4 )); echo $?
1
并对构造进行类似的测试,[[ .. ]]
以了解这些基本构建块。完成后,继续进行if
陈述case
。
至于你问题的答案,我认为这很大程度上取决于所询问的上下文。但是,充分了解各种选项应该可以帮助你弄清楚他们在那里寻找什么。