4

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

例如。

我可不可以做

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

或者我必须在对象之间总是有一个或两个空格,因为

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

第二个相关问题是关于

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

我担心的是在 , 之前/之后的[间距]

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

4

1 回答 1

15

[前后都需要空格]

  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 `]'
    

[[是一种 bash 增强功能,具有比 更多的功能[,即更明智地处理未引用的变量名。它要求两端有一个空格,与 相同[。然而[[,实际上是特殊的 shell 语法,并且解析方式不同。这不是“普通命令”的方式[

[有关和之间区别的详细说明[[,请参见:

于 2013-09-26T15:45:04.277 回答