为啥在 Bash 中的 '[' 和 ']' 周围应该有空格?

Posted

技术标签:

【中文标题】为啥在 Bash 中的 \'[\' 和 \']\' 周围应该有空格?【英文标题】:Why should there be spaces around '[' and ']' in Bash?为什么在 Bash 中的 '[' 和 ']' 周围应该有空格? 【发布时间】:2012-03-23 18:37:14 【问题描述】:

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

if[$CHOICE -eq 1];

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

if [ $CHOICE -eq 1 ];

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

【问题讨论】:

一般语法是if command; then commands_if_exit_code_is_0; else commands_if_exit_code_is_nonzero; fi;command 可以是任何命令,[ 只是其中之一。 相关:***.com/questions/4977367/…(运算符周围也需要空格)。 查看相关帖子:Is double square brackets preferable over single square brackets in Bash?。 如果$CHOICE"foo",您正在尝试运行命令["foo" 在 Bash 中,[[ 遵循相同的要求;你需要两边都有空格,命令需要以]]结尾。加倍版本更加通用和强大。请参阅上面@codeforester 的链接以进行更细致的讨论。 【参考方案1】:

一旦您掌握了 [ 是一个命令,一切就会变得更加清晰!

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

help [

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

help test

...了解更多信息。


另外请注意,我有意使用help test 而不是man test。那是因为test[ 现在是shell 内置命令。它们的功能集可能与 coreutils 中的 /bin/test/bin/[ 不同,后者是 man 页面中描述的命令。

【讨论】:

最初,它位于/usr/bin/[ 并且是/usr/bin/test 的硬链接,当以[ 调用时,您应该包含一个右大括号作为最后一个参数。现在它是一个内置的 shell。 请注意,它们并不完全“完全”相同。 [ 要求它的最后一个参数是 ]【参考方案2】:

[ 是一个命令,$CHOICE 应该是一个参数,但是通过执行[$CHOICE(在[$CHOICE 之间没有任何空格),您正在尝试运行一个名为[$CHOICE 的命令。命令的语法是:

command arguments separated with space

【讨论】:

【参考方案3】:

来自another question:

一点历史:这是因为 '[' 在历史上不是 shell 内置的,而是一个单独的可执行文件,它接收表达式作为参数并返回结果。如果你没有用空格包围 '[',shell 将在 $PATH 中搜索不同的文件名(而不是找到它)。 – Andrew Medico 2009 年 6 月 24 日 1:13

【讨论】:

【参考方案4】:

[ 是一个test 命令。所以它需要空间。

【讨论】:

以上是关于为啥在 Bash 中的 '[' 和 ']' 周围应该有空格?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 shinyFeedback 会覆盖自定义 CSS?

在 UITableView 中使用 Auto Layout,为啥周围有这么多多余的空间?

如何在 bash 中的任意数量的空格之后搜索和替换字符串?

为啥要在 bash 中休眠和等待?

orbslam里为啥要分单应矩阵和本质矩阵来分别恢复R和T

为啥我的 bash 脚本无法识别 date 命令中的变量?