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

在学习一些关于bash的知识时,我会看到四种使用if语句的方法:

  • 单括号 - (...)
  • 双括号 - ((...))
  • 单方形支架 - [...]
  • 双方括号 - [[...]]
  • bash中的括号和方括号有什么区别。


    您列出的测试:

  • 单个括号 - (...)正在创建一个子外壳
  • 双括号 - ((...))用于算术运算
  • 单方括号 - [...]是POSIX test的语法
  • 双方括号 - [[...]]是bash条件表达式的语法(类似于test但更强大)
  • 并非详尽无遗,您可以使用布尔逻辑

    if command; then ...
    

    因为这些命令有退出状态。 在bash0true ,> 0false

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

    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
    

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

    符号(( ... ))引入了一个算术上下文。 再一次,这是不是原来的Bourne shell的一部分(它有一个专用的外部工具expr用于这些东西),但现代的shell有内置的。如果算术表达式的结果代码为0不是0(或错误)。

    符号( command )创建一个子shell并在其中评估command 。 在某些情况下,这实际上是必要和有用的,但如果你只是在学习语法,你不太可能需要这个。

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

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

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

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

    if command; then
        : ...
    
    链接地址: http://www.djcxy.com/p/17471.html

    上一篇: Difference in Bash between IF statements with parenthesis and square brackets

    下一篇: What is the preferred Bash shebang?