方括号中的壳间距

时间:2013-09-26 15:41:18

标签: shell syntax

作为初学者,我没有在任何地方找到答案,关于间距(语法)和解析的规则。

例如。

我可以吗

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

或者我必须在对象之间留下一两个空白,如

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

和第二个相关的问题是关于

之间的区别
if [[ $# -eq 2 ]] ;
then
wafwaf
fi

我的担忧是关于[]之前/之后的间距。

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

1 个答案:

答案 0 :(得分:8)

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

  1. [实际上是命令的名称,是test的别名。它不是一个特殊的符号,它只是一个名字不同的命令。

    $ 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 `['.
    
  2. 因为它是普通的命令名而不是特殊字符,所以[后需要一个空格。如果省略空格并写[foo,shell将在$PATH中搜索名为[foo的命令。

    $ [ foo = foo ] && echo true
    true
    $ [foo = foo] && echo true
    [foo: command not found
    
  3. 为了便于阅读,[期望其最后一个参数正好是]。作为一个普通的命令行参数,]必须在它之前有一个空格。如果没有空格,那么括号将成为前一个参数的最后一个字符,而[会抱怨它的最后一个参数不是]

    $ [ foo = foo]
    bash: [: missing `]'
    $ [ foo = 'foo]'
    bash: [: missing `]'
    
  4. [[是一种bash增强功能,其功能多于[,即对未加引号的变量名称进行更精确的处理。它需要两端的空格,与[相同。但是[[实际上是特殊的shell语法,并且解析方式不同。它[的方式不是“普通命令”。

    有关[[[之间差异的详细说明,请参阅: