提问人:Shash 提问时间:3/6/2012 最后编辑:that other guyShash 更新时间:4/5/2022 访问量:12640
为什么 Bash 中的“[”和“]”周围应该有空格?
Why should there be spaces around '[' and ']' in Bash?
问:
我正在尝试编写一个使用语句的 Bash 脚本。if
if[$CHOICE -eq 1];
脚本给了我错误,直到我在之前和之后和之前给出了一个空格,如下所示:[
]
if [ $CHOICE -eq 1 ];
我的问题是,为什么方括号周围的空间在 Bash 中如此重要?
答:
99赞
johnsyweb
3/6/2012
#1
一旦你掌握了 [
是一个命令,很多事情就会变得更加清晰!
[
是拼写“”的另一种方式。test
help [
然而,虽然他们做完全相同的事情,但结果却有一个更详细的帮助页面。检查test
help test
...了解更多信息。
此外请注意,我是故意使用的,而不是 .那是因为现在是 shell 内置命令。它们的功能集可能与 coreutils 不同,coreutils 是页面中描述的命令。help test
man test
test
[
/bin/test
/bin/[
man
评论
7赞
Benoit
3/6/2012
最初,它是 和 的硬链接,当调用时,您应该包含一个右括号作为最后一个参数。现在它是一个内置的 shell。/usr/bin/[
/usr/bin/test
[
3赞
William Pursell
7/16/2019
请注意,它们并不完全“完全”相同。 要求其最后一个参数为 。[
]
19赞
Cameron
3/6/2012
#2
从另一个问题:
一点历史:这是因为 '[' 在历史上不是 shell 内置的,而是一个单独的可执行文件,它接收 expresson 作为参数并返回结果。如果您没有用空格将“[”括起来,shell 将$PATH搜索不同的文件名(并且找不到它)。 – 安德鲁·梅迪科 Jun 24 '09 at 1:13
3赞
Prince John Wesley
3/6/2012
#3
[
是一个命令。所以它需要空间。test
9赞
Jahid
6/18/2015
#4
[
是一个命令,应该是一个参数,但是通过执行(和 之间没有任何空格)您正在尝试运行名为 的命令。命令的语法为:$CHOICE
[$CHOICE
[
$CHOICE
[$CHOICE
command arguments separated with space
2赞
Daniel
4/5/2022
#5
值得注意的是,[ 也用于 glob 匹配,这可能会给你带来麻烦。
$ echo [12345]
[12345]
$ echo oops >3
$ echo [12345]
3
评论
0赞
tripleee
3/17/2023
如果这里发生了什么不明显,在第一种情况下,您碰巧没有任何与通配符表达式匹配的文件,因此 shell 将其保留为未展开状态。但是当有一个名为 的文件时,这就是通配符扩展到的内容。[12345]
3
评论
command
可以是任何命令,并且只是其中之一。if command; then commands_if_exit_code_is_0; else commands_if_exit_code_is_nonzero; fi;
[
$CHOICE
"foo"
["foo"
[[
]]