关于if语句:为什么在bash的”[“后面和”]”之前应该有一个空格?

Why should there be a space after '[' and before ']' in Bash?

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

1
if  [$CHOICE -eq 1];

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

1
if  [ $CHOICE -eq 1 ];

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


一旦你明白了[是一个命令,那么整个过程就会变得更加清晰!

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

1
help [

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

1
help test

…了解更多信息。

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


从另一个问题:

A bit of history: this is because '[' was historically not a shell-built-in but a separate executable that received the expresson as arguments and returned a result. If you didn't surround the '[' with space, the shell would be searching $PATH for a different filename (and not find it) . – Andrew Medico Jun 24 '09 at 1:13


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

1
command arguments separated with space

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