77

在学习一点的同时,我看到了四种使用if语句的方式:

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

bash中的括号和方括号有什么区别。

4

2 回答 2

86

您列出的测试:

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

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

if command; then ...

也是,因为命令具有退出状态。在bash,0true和 >0false.

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

command
echo $?

看 :

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

于 2012-10-07T02:23:22.497 回答
5

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 缺少内置运算符来检查字符串是否为空或文件是否存在。现代 shell 内置了这个命令,许多 shell 都有扩展和现代化的版本[[,但是这不能正确地移植到 POSIX sh,因此应该避免用于可移植脚本。这个相关问题更详细地解释了两者之间的差异。

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

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

...事实上,在我看到的大多数脚本中,这显然是没有必要的。

另一个需要注意的反模式是

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

您几乎不需要$?明确检查,特别是,将其与零进行比较是在幕后专门if为您做的事情。这应该简单地重构为while

if command; then
    : ...
于 2018-04-08T08:34:07.470 回答