【问题标题】:Bash - when using Double Square brackets and when single square brackets [duplicate]Bash - 使用双方括号和单方括号时[重复]
【发布时间】:2014-07-22 04:31:49
【问题描述】:

请按照以下示例进行(请注意STRING为空)

获取错误

 [root@linux /tmp]# STRING=
 [root@linux /tmp]#  [ $STRING = dog ] && echo "yes its a dog"
 bash: [: =: unary operator expected

语法没有错误

 [root@linux /tmp]# STRING=
 [root@linux /tmp]# [[ $STRING = dog ]] && echo "yes its a dog"
 [root@linux /tmp]# [[ $STRING != dog ]] && echo "yes its a dog"
 yes its a dog

为什么当我使用单方括号时,我得到 - 需要一元运算符

但是在双方括号的情况下,语法给出了很好的结果

【问题讨论】:

    标签: linux bash shell sh ksh


    【解决方案1】:

    [[ ]] 不同,单方括号会像普通命令一样进行分词。将其视为类似于将参数传递给 test 内置函数。 [[ ]] 是特殊的,其中的变量不与 IFS 拆分。这就是为什么最好使用[[ ]] 的原因,因为它更高效、更安全。

    这只是[ 无法做到的事情之一。使用[,您可以使用{ }( ) 使其工作。请注意,( ) 调用了一个子shell,而{ } 最后总是需要一个分号,这很难看。但是,您可以使用[[ ]] 安全地做到这一点:

    [[ a != b && c != d && ( something || something ) ]]
    

    顺便说一句,要解决您的问题,您必须将变量放在双引号中以防止拆分:

    [ "$STRING" = dog ]
    

    [[ 不需要。

    Sere 分词:https://www.gnu.org/software/bash/manual/html_node/Word-Splitting.html

    添加:

    看起来$STRING 实际上被跳过了作为空而不是拆分的参数。类似地,它被解释为普通命令的概念将适用,并且应用双引号将修复它。

    【讨论】:

      【解决方案2】:

      因为[[ 很特别。 [ 需要保持 Bourne shell 的兼容性,包括其局限性。由于[[是bash中单独引入的构造,所以可以修复。

      【讨论】:

        【解决方案3】:

        很难搜索,但这个问题经常被问到。尝试用谷歌搜索“bash 方括号”,你会看到很多关于这个主题的讨论,主要是关于 SO:

        https://www.google.com/search?q=bash+square+brackets

        https://serverfault.com/questions/52034/what-is-the-difference-between-double-and-single-square-brackets-in-bash

        http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29

        简短的回答是始终使用 [[ 除非你知道...

        【讨论】:

          猜你喜欢
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          • 2010-10-14
          • 2021-09-07
          • 2019-12-03
          • 1970-01-01
          相关资源
          最近更新 更多