方括号中的壳间距

Les*_*ein 2 syntax shell

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

例如.

我可不可以做

if [$# -eq 2] ; 
then 
    llll 
fi
Run Code Online (Sandbox Code Playgroud)

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

if [ $# -eq 2 ] ;
then
   llll
fi
Run Code Online (Sandbox Code Playgroud)

第二个相关的问题是关于它们之间的区别

if [[ $# -eq 2 ]] ;
then
wafwaf
fi
Run Code Online (Sandbox Code Playgroud)

我关心的是前后间距[,].

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

Joh*_*ica 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 `['.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 因为它是普通的命令名而不是特殊字符,所以在之后需要一个空格[.如果省略空格并写入[fooshell将搜索$PATH名为的命令[foo.

    $ [ foo = foo ] && echo true
    true
    $ [foo = foo] && echo true
    [foo: command not found
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为了便于阅读,请[期待它的最后一个参数].作为一个普通的命令行参数,]必须在它之前有一个空格.如果没有空格,那么括号将成为前一个参数的最后一个字符,并[会抱怨其最后一个参数不存在].

    $ [ foo = foo]
    bash: [: missing `]'
    $ [ foo = 'foo]'
    bash: [: missing `]'
    
    Run Code Online (Sandbox Code Playgroud)

[[是一种bash增强功能,具有更多功能[,即对未加引号的变量名称进行更精细的处理.它需要两端的空间,相同[.但[[实际上是特殊的shell语法,并且解析方式不同.它的方式不是"普通命令" [.

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