在shell中,方括号内的空格

8
作为一个初学者,我在任何地方都没有找到有关空格(语法)和解析规则的答案。
例如:
我能这样做吗?
if [$# -eq 2] ; 
then 
    llll 
fi

还是说我必须在对象之间始终留有一个或两个空格,例如

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

第二个相关问题是关于两者之间的区别。
if [[ $# -eq 2 ]] ;
then
wafwaf
fi

我关心的问题是在[]之前/之后的间距。
目前我没有找到一套规则。

了解什么是有效的 shell 语法,什么不是的好方法是尝试它。 - Neil
1个回答

18

[]之后需要加空格。

  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的命令。

  3. $ [ foo = foo ] && echo true
    true
    $ [foo = foo] && echo true
    [foo: command not found
    
    为了易读性,[ 命令要求其最后一个参数必须恰好是 ]。作为普通的命令行参数,] 必须在它前面加上空格。如果没有空格,则尖括号会成为上一个参数的最后一个字符,[ 命令会抱怨它的最后一个参数不是 ]
    $ [ foo = foo]
    bash: [: missing `]'
    $ [ foo = 'foo]'
    bash: [: missing `]'
    
    [[ 是 Bash 的一个增强功能,比 [ 更具特色,尤其是对未加引号的变量名的处理更为合理。与 [ 相同,[[ 前后需要空格。但是实际上,[[ 是特殊的 shell 语法,并以不同方式解析。它不像 [ 那样是一个“普通命令”。

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


1
+1。但也许值得澄清的是,[[ 是特殊语法并不意味着它是自限定的。你需要在 [[]] 前后加上空格(或自限定字符),就像 [] 一样。自限定字符包括空格、制表符和 |&()<>;。(由于 bash 的怪癖,这并不完全准确,因为像 ((>& 这样的东西是标记。但这是一个很好的近似值。) - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接