为啥在 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 中的 '[' 和 ']' 周围应该有空格?的主要内容,如果未能解决你的问题,请参考以下文章