Bash条件语句中括号和圆括号的区别

90

在学习一些有关 的知识时,我了解到处理 if 语句有四种方式:

  • 单圆括号 - ( ... )
  • 双圆括号 - (( ... ))
  • 单方括号 - [ ... ]
  • 双方括号 - [[ ... ]]

在 Bash 中,圆括号和方括号的区别是什么?


http://www.linuxquestions.org/questions/programming-9/bash-conditions-versus-%5B-819433/ - BLUC
https://dev59.com/O3A75IYBdhLWcg3wMl8Z - BLUC
2个回答

101

你列出的测试:

  • 单括号 - ( ... ) 创建一个子shell
  • 双括号 - (( ... )) 用于算术运算
  • 单方括号 - [ ... ] 是POSIX test的语法
  • 双方括号 - [[ ... ]] 是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


4
$?并不是返回值,它实际上是表示退出状态;0代表成功,1代表失败,你可以将其理解为true和false。 - Edouard Thiel
将“返回值”替换为“退出状态”,是的,但失败不仅限于1,而是所有状态> 0,正如我在帖子中所写的那样。 - Gilles Quénot
curl /dev/null 退出代码为3。 - Gilles Quénot
@sputnick,实际上,失败是所有状态!= 0 - 负退出值也是可能的。 - twalberg
1
@twalberg 负的退出值会被环绕 - 例如,exit -1 的结果是退出值为255。 - craymichael
0表示真,非零表示假——除了在算术运算中。当退出状态为零时,“if (( ${?} ))”为假,当非零时为真。有点令人困惑! - Paddy Landau

7

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有一个扩展和现代化的版本[[,但这并不适用于可移植脚本,因此应避免使用。 此相关问题更详细地解释了两者之间的区别。
符号(( ... ))引入算术上下文。同样,这是原始的Bourne shell中没有的东西(它有一个专用的外部工具expr),但现代shell已经内置了它。算术表达式的结果代码为0,如果算术评估的结果不为0(或出现错误)。
符号( command )创建一个子shell并在其中评估command。有些情况下,这实际上是必要和有用的,但如果你只是学习语法,你不太可能需要它。
...事实上,在我看到的大多数脚本中,这在条件语句中使用是明显不必要的。
另一个要注意的反模式是
command
if [ $? = 0 ]; then
    : things
fi

你几乎不需要显式地检查$?,尤其是将其与零进行比较,这是ifwhile在幕后特别为您完成的。只需进行重构即可:

if command; then
    : ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接