Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 方括号中的壳间距_Shell_Syntax - Fatal编程技术网

Shell 方括号中的壳间距

Shell 方括号中的壳间距,shell,syntax,Shell,Syntax,作为一个初学者,我在任何地方都找不到答案,关于空格(语法)和语法分析的规则 比如说 我能做什么 if [$# -eq 2] ; then llll fi 或者我必须在对象之间始终有一个或两个空格,如 if [ $# -eq 2 ] ; then llll fi 第二个相关问题是关于 if [[ $# -eq 2 ]] ; then wafwaf fi 我关心的是[,]前后的间距 没有搜索为我提供一组规则。在[之后和]之前需要空格 $ [ foo = foo] bash:

作为一个初学者,我在任何地方都找不到答案,关于空格(语法)和语法分析的规则

比如说

我能做什么

if [$# -eq 2] ; 
then 
    llll 
fi
或者我必须在对象之间始终有一个或两个空格,如

if [ $# -eq 2 ] ;
then
   llll
fi
第二个相关问题是关于

if [[ $# -eq 2 ]] ;
then
wafwaf
fi
我关心的是
[
]
前后的间距


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

[
之后和
]
之前需要空格

$ [ foo = foo]
bash: [: missing `]'
$ [ foo = 'foo]'
bash: [: missing `]'
  • [
    实际上是一个命令的名称,是
    测试的别名。它不是一个特殊符号,只是一个具有不寻常名称的命令

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

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

    $ [ foo = foo]
    bash: [: missing `]'
    $ [ foo = 'foo]'
    bash: [: missing `]'
    
  • [
    是一种bash增强功能,比
    [
    具有更多的功能,即对不带引号的变量名进行更合理的处理。它要求两端都有一个空格,与
    [
    相同。然而
    [
    实际上是一种特殊的shell语法,解析方式也不同。它不像
    [
    那样是一个“普通命令”

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


    知道什么是有效的shell语法,什么不是的一个好方法是尝试它。+1.但也许值得澄清的是,
    [[
    是特殊语法这一事实并不意味着它是自定界的。你需要在
    [[[
    ]
    前后使用空格(或自定界字符),就像
    [
    ]
    。自定界字符是空格、制表符和
    |&()
    (这是由于bash的特性,因为
    &
    都是标记。但这是一个很好的近似值。)