为什么 Bash 中的“[”和“]”周围应该有空格?

Why should there be spaces around '[' and ']' in Bash?

提问人:Shash 提问时间:3/6/2012 最后编辑:that other guyShash 更新时间:4/5/2022 访问量:12640

问:

我正在尝试编写一个使用语句的 Bash 脚本。if

if[$CHOICE -eq 1];

脚本给了我错误,直到我在之前和之后和之前给出了一个空格,如下所示:[]

if [ $CHOICE -eq 1 ];

我的问题是,为什么方括号周围的空间在 Bash 中如此重要?

bash if-statement 语法

评论

8赞 Benoit 3/6/2012
一般语法是 。command 可以是任何命令,并且只是其中之一。if command; then commands_if_exit_code_is_0; else commands_if_exit_code_is_nonzero; fi;[
1赞 tripleee 10/2/2017
相关新闻: stackoverflow.com/questions/4977367/... (您也需要在操作员周围留出空间)。
1赞 codeforester 8/16/2018
请参阅此相关帖子: 在 Bash 中,双方括号是否比单方括号更可取?.
1赞 tripleee 1/31/2020
如果是 ,则尝试运行命令 。$CHOICE"foo"["foo"
1赞 tripleee 3/30/2021
在 Bash 中,遵循相同的要求;两边都需要空格,命令需要以 结尾。加倍版本更加通用和坚固;请参阅上面@codeforester的链接,进行更细致的讨论。[[]]

答:

99赞 johnsyweb 3/6/2012 #1

一旦你掌握了 [ 是一个命令,很多事情就会变得更加清晰!

[是拼写“”的另一种方式。test

help [

然而,虽然他们做完全相同的事情,但结果却有一个更详细的帮助页面。检查test

help test

...了解更多信息。


此外请注意,我是故意使用的,而不是 .那是因为现在是 shell 内置命令。它们的功能集可能与 coreutils 不同,coreutils 是页面中描述的命令。help testman testtest[/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