为什么';[';和';]';在Bash?

为什么';[';和';]';在Bash?,bash,if-statement,syntax,Bash,If Statement,Syntax,我试图编写一个Bash脚本,它使用if语句 if[$CHOICE -eq 1]; 脚本一直在给我错误,直到我在[之前和之后以及]之前给了一个空格,如下所示: if [ $CHOICE -eq 1 ]; 我这里的问题是,为什么方括号周围的空间在Bash中如此重要?一旦你理解了[是一个命令,一切都变得更加清晰了 [是另一种拼写“test”的方法 然而,尽管它们的操作完全相同,test显示了一个更详细的帮助页面。请检查 help test …了解更多信息 此外,请注意,我有意使用的是帮助测试,

我试图编写一个Bash脚本,它使用
if
语句

if[$CHOICE -eq 1];
脚本一直在给我错误,直到我在
[
之前和之后以及
]
之前给了一个空格,如下所示:

if [ $CHOICE -eq 1 ];

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

一旦你理解了
[
是一个命令,一切都变得更加清晰了

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

然而,尽管它们的操作完全相同,
test
显示了一个更详细的帮助页面。请检查

help test
…了解更多信息


此外,请注意,我有意使用的是
帮助测试
,而不是
人工测试
。这是因为
测试
[
现在都是shell内置命令。它们的功能集可能与
/bin/test
/bin>不同/[
来自coreutils,这是
man
页面中描述的命令。

来自:

一点历史:这是因为“[”在历史上不是一个内置的shell,而是一个单独的可执行文件,它接收expresson作为参数并返回一个结果。如果不在“[”周围加空格,shell将在$PATH中搜索另一个文件名(但找不到)。–2009年6月24日1:13


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

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

command arguments separated with space

最初,它位于
/usr/bin/[
,是指向
/usr/bin/test
的硬链接,当作为
[
调用时,您应该包括一个右括号作为最后一个参数。现在它是一个shell内置参数。请注意,它们并不完全“完全”相同。
[
要求其最后一个参数是
]
。一般语法是
if command;then commands\u if\u exit\u code\u是\u 0;else commands\u if\u exit\u code\u是非零;fi;
command
可以是任何命令,
[
只是其中之一。相关:(您也需要操作符周围的空格)。请参阅此相关帖子:.if
$CHOICE
“foo”
,您正在尝试运行命令
[“foo”
command arguments separated with space