作为初学者,我没有在任何地方找到答案,关于间距(语法)和解析的规则。
例如。
我可以吗
if [$# -eq 2] ;
then
llll
fi
或者我必须在对象之间留下一两个空白,如
if [ $# -eq 2 ] ;
then
llll
fi
和第二个相关的问题是关于
之间的区别if [[ $# -eq 2 ]] ;
then
wafwaf
fi
我的担忧是关于[
,]
之前/之后的间距。
没有搜索为我提供了一套规则。
答案 0 :(得分:8)
[
之后和]
之前需要空格。
[
实际上是命令的名称,是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 `['.
因为它是普通的命令名而不是特殊字符,所以[
后需要一个空格。如果省略空格并写[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语法,并且解析方式不同。它[
的方式不是“普通命令”。
有关[
和[[
之间差异的详细说明,请参阅: