关于语法:方括号中的Shell间距

Shell spacing in square brackets

本问题已经有最佳答案,请猛点这里访问。

作为一个初学者,我没有找到任何答案,关于空格(语法)和解析的规则。

例如。

我可以吗

1
2
3
4
if [$# -eq 2] ;
then
    llll
fi

或者我必须在物体之间总是有一两个空白,比如

1
2
3
4
if [ $# -eq 2 ] ;
then
   llll
fi

第二个相关问题是

1
2
3
4
if [[ $# -eq 2 ]] ;
then
wafwaf
fi

我关心的是[]前后的间距。

没有搜索为我提供了一套规则。


[之后和]之前需要空间。

  • [实际上是命令的名称,是test的别名。它不是一个特殊的符号,它只是一个带有特殊名称的命令。

    1
    2
    3
    4
    5
    6
    $ help '['
    [: [ arg... ]
        Evaluate conditional expression.

        This is a synonym for the"test" builtin, but the last argument must
        be a literal `]', to match the opening `['.
  • 因为它是一个普通的命令名而不是特殊的字符,所以在[后面需要一个空格。如果您省略了空格并编写[foo,shell将在$PATH中搜索名为[foo的命令。

    1
    2
    3
    4
    $ [ foo = foo ] && echo true
    true
    $ [foo = foo] && echo true
    [foo: command not found

  • 为了可读性,[希望它的最后一个参数正好是]。作为一个普通的命令行参数,]前面必须有一个空格。如果没有空格,则括号将成为前一个参数的最后一个字符,并且[将抱怨其最后一个参数不是]

    1
    2
    3
    4
    $ [ foo = foo]
    bash: [: missing `]'
    $ [ foo = 'foo]'
    bash: [: missing `]'
  • [[是一个bash增强,它的特性比[多,也就是说,对未加引号的变量名的处理更为合理。它需要两端的A空间,与[相同。然而,[[实际上是特殊的shell语法,并且解析方式不同。这不是一个"普通的命令",就像[一样。

    有关[[[之间差异的详细解释,请参见:

    • 巴什的[和]有什么区别?