当使用双方括号和单方括号时

这个问题在这里已经有了答案:

  • 在将空值与字符串2的答案进行比较时,在shell脚本中预期使用一元运算符
  • 一元运算符预期4个答案

  • [[ ]]不同,单个方括号与普通命令一样受字分割的限制。 把它看作是传递参数来test内建函数。 [[ ]]是特殊的,它内部的变量不会被IFS分割。 这就是为什么最好使用[[ ]]因为它更高效和更安全。

    这只是你无法做的事情之一[ 。 与[你会玩{ }( )使其工作。 请注意( )召唤一个子shell,并且{ }总是需要一个分号,这很难看。 但是,您可以使用[[ ]]安全地执行此操作:

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

    顺便解决你的问题,你必须把变量放在双引号中以防止分裂:

    [ "$STRING" = dog ]
    

    随着[[这不需要。

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

    加:

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


    因为[[是特别的。 [需要保留Bourne shell兼容性,包括其限制。 由于[[是一个在bash中单独引入的构造,因此它可以被修复。


    搜索很困难,但这经常被问到。 试着用google搜索“bash square brackets”,你会看到很多关于这个主题的讨论,主要是关于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

    简短的答案是总是使用[[除非你知道否则...

    链接地址: http://www.djcxy.com/p/97073.html

    上一篇: when using Double Square brackets and when single square brackets

    下一篇: Output redirection inside/outside square brackets in Bash