带有括号和方括号的IF语句之间的Bash差异

时间:2012-10-07 01:21:41

标签: bash if-statement

在了解时,我会看到使用if语句的四种方式:

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

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

2 个答案:

答案 0 :(得分:63)

您列出的测试:

  • 单括号 - (...)正在创建子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

答案 1 :(得分:2)

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 )创建一个子shell并在其中评估command。在某些情况下,这实际上是必要且有用的,但如果您只是学习语法,则不太可能需要这样做。

...事实上,在大多数脚本中,我看到过这种情况在条件中使用,显然是不必要的。

要注意的另一个反模式是

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

您几乎不需要明确地检查$?,特别是将它与零进行比较是ifwhile 具体为您做的事情场景。这应该简单地重构为

if command; then
    : ...