【问题标题】:Shell spacing in square brackets [duplicate]方括号中的壳间距[重复]
【发布时间】:2013-10-02 16:24:36
【问题描述】:

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

例如。

可以吗

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

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

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

第二个相关问题是关于两者的区别

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

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

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

【问题讨论】:

  • 了解什么是有效的 shell 语法以及什么不是的好方法是尝试一下。

标签: shell syntax


【解决方案1】:

[ 之后和] 之前必须有空格。

  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 语法并且被不同地解析。这不是 [ 那样的“普通命令”。

[[[的区别详细解释见:

【讨论】:

  • +1。但也许值得澄清的是,[[ 是特殊语法这一事实并不能使其自定界。在[[]] 前后需要空格(或自定界字符),就像[] 一样。自定界字符是空格、制表符和|&()<>;。 (由于 bash 的特性不太准确,因为 ((>& 之类的东西是令牌。但这是一个很好的近似值。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2014-06-12
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2014-11-26
  • 2018-09-28
相关资源
最近更新 更多