为什么Bash中的方括号 '[' 和 ']' 周围应该有空格?

84

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

if[$CHOICE -eq 1];

在我加入以下空格后,脚本就不会再出现错误:[前后各一个空格以及]前面一个空格。

if [ $CHOICE -eq 1 ];

我在这里提出的问题是,为什么Bash中方括号周围的空格很重要?


8
通用的语法是 if command; then commands_if_exit_code_is_0; else commands_if_exit_code_is_nonzero; fi;。*command* 可以是任何命令,而 [ 只是其中之一。 - Benoit
1
相关链接:https://dev59.com/TW445IYBdhLWcg3wOnrW (你需要在运算符周围添加空格)。 - tripleee
1
请参考此相关帖子:在Bash中,双方括号是否比单方括号更可取? - codeforester
https://dev59.com/zXE95IYBdhLWcg3wi-ae#2268117 - William Pursell
1
如果 $CHOICE"foo",那么你正在尝试运行命令 ["foo"] - tripleee
1
在Bash中,[[ 遵循相同的要求;您需要在两侧添加空格,并且命令需要以 ]] 结尾。双倍版本有点更加灵活和强大;请参阅上面 @codeforester 的链接以获取更细致的讨论。 - tripleee
5个回答

99

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

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

help [

然而,虽然它们执行的功能完全相同,但test命令拥有一个更加详细的帮助页面。请检查。

help test

...获取更多信息。


此外,请注意我故意使用help test而不是man test。这是因为test[现在是shell内置命令。它们的功能集可能不同于man页中描述的核心实用程序/bin/test/bin/[


7
最初它位于/usr/bin/[,是指向/usr/bin/test的硬链接,当使用[命令调用时,需要在最后一个参数中包含闭括号。现在它已经成为了shell内置命令。 - Benoit
3
请注意它们并非完全“一模一样”。 [ 命令要求其最后一个参数为 ] - William Pursell

19

来自另一个问题

历史上,这是因为'['不是shell内置的命令,而是一个单独的可执行文件,它接收表达式作为参数并返回结果。如果您没有将'['用空格包围,则shell会在$PATH中搜索不同的文件名(并且找不到它)。 - Andrew Medico Jun 24 '09 at 1:13


9

[ 是一个命令,$CHOICE 应该是它的参数。但是,通过这样做 [$CHOICE(在 [$CHOICE 之间没有任何空格),你尝试运行一个名为 [$CHOICE 的命令。命令的语法如下:

command arguments separated with space

3

[ 是一个测试命令。因此需要空格。


2
值得注意的是,[也被用于glob匹配中,这可能会给你带来麻烦。
$ echo [12345]
[12345]
$ echo oops >3
$ echo [12345]
3

如果这里的情况不明显,第一个示例中你没有任何与通配符表达式[12345]匹配的文件,所以shell将其保留为未扩展的形式。但是当存在名为3的文件时,通配符就会扩展成它。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接