Bash条件中括号和括号之间的区别


Answers:


75

您列出的测试:

  • 单括号-(...)正在创建子外壳
  • 双括号-((...))用于算术运算
  • 单方括号-[...]是POSIX的语法 test
  • 双方括号-[[...]]是bash条件表达式的语法(类似test但功能更强大)

并不详尽,可以使用布尔逻辑

if command; then ...

同样,因为命令具有退出状态。在bash0istrue和> 0is中false

您可以看到这样的退出状态:

command
echo $?

见:

http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals


3
$?不是确切的返回值,实际上是退出状态;0表示成功,1表示失败,您可以将其解释为是非。
爱德华·蒂尔

用“退出状态”代替“返回值”,对,但是失败不仅是1,而是所有状态> 0,如我在帖子中所写。
吉尔斯·奎诺

例如:curl /dev/null以3退出
吉尔斯·奎诺

@sputnick实际上,失败是所有状态!= 0-负的退出值也是可能的。
twalberg 2013年

1
@twalberg负的退出值回绕-例如exit -1导致退出值为255
craymichael

4

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

该命令[(aka test)在条件语句中非常常用,因为原始的Bourne shell缺少内置运算符来检查字符串是否为空或文件是否存在。现代外壳程序内置了此命令,许多外壳程序具有扩展和现代化的版本[[,但这不适用于POSIX sh,因此对于可移植脚本应避免使用。这个相关问题更详细地解释了两者之间的差异。

该符号(( ... ))引入了算术上下文。同样,这不是原始Bourne外壳的一部分(它具有专用的外部工具expr于这些功能的),但是现代外壳具有此内置功能。如果算术评估的结果为,则算术表达式的结果代码为0不是0(或错误)。

该符号( command ) 创建一个子外壳并进行评估command。在某些情况下,这实际上是必要且有用的,但是如果您只是学习语法,就不太可能需要它。

...实际上,在大多数脚本中,我已经看到有条件地使用了此脚本,这显然是不必要的。

要注意的另一个反模式是

command
if [ $? = 0 ]; then
    : things
fi

你应该几乎从来没有需要检查$?明确,尤其是,它与零进行比较的东西if,并while 专门为你做幕后。这应该简单地重构为

if command; then
    : ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.