在稍微了解 bash 的过程中,我发现了四种使用 if
语句的方法:
单括号 - ( ... )
双括号 - (( ... ))
单方括号 - [ ... ]
双方括号 - [[ ... ]]
bash中的括号和方括号有什么区别。
您列出的测试:
单括号 - ( ... ) 正在创建一个子shell
双括号 - (( ... )) 用于算术运算
单方括号 - [ ... ] 是 POSIX 测试的语法
双方括号 - [[ ... ]] 是 bash 条件表达式的语法(类似于 test 但更强大)
并不详尽,您可以使用布尔逻辑
if command; then ...
也是,因为命令具有退出状态。在 bash
中,0
是 true
并且 > 0
是 false
。
你可以看到这样的退出状态:
command
echo $?
看 :
http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals
shell 本身只运行命令并评估其退出代码。零退出代码表示成功;所有其他值表示失败。
if command; then
: things to do if the exit code from command was 0
else
: things to do if it was not 0
fi
while command; do
: things to do if the exit code was 0
done
命令 [
(又名 test
)在条件句中非常常用,因为原始 Bourne shell 缺少内置运算符来检查字符串是否为空或文件是否存在。现代 shell 内置了这个命令,许多 shell 有一个扩展和现代化的版本 [[
,但这不能正确地移植到 POSIX sh
,因此应该避免用于可移植脚本。 This related question 更详细地解释了两者之间的区别。
符号 (( ... ))
引入了算术上下文。同样,这不是原始 Bourne shell 的一部分(它有一个专用的外部工具 expr
来处理这些事情),但现代 shell 内置了它。算术表达式的结果代码为 0,如果算术评估不是 0(或错误)。
符号 ( command )
创建一个子外壳并在其中评估 command
。在某些情况下,这实际上是必要且有用的,但如果您只是学习语法,则不太可能需要它。
...事实上,在我看到的大多数脚本中,这显然是没有必要的。
另一个需要注意的反模式是
command
if [ $? = 0 ]; then
: things
fi
您几乎不需要明确地检查 $?
,尤其是将其与零进行比较是 if
和 while
专门在幕后为您做的事情。这应该简单地重构为
if command; then
: ...
$?
不完全是返回值,实际上是退出状态; 0 代表成功,1 代表失败,您可以将其解释为真假。curl /dev/null
退出 3exit -1
导致退出值为 255