为什么在Bash中'['之前'''之后会有一个空格?

Sha*_*ash 58 syntax bash if-statement

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

if  [$CHOICE -eq 1];
Run Code Online (Sandbox Code Playgroud)

剧本是给我的错误,直到我后得到的空间[和之前]如下所示:

if  [ $CHOICE -eq 1 ];
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*web 70

一旦你掌握了这[是一个命令,一大堆就会变得更加清晰!

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

help [
Run Code Online (Sandbox Code Playgroud)

然而,虽然它们完全相同,但test结果却有了更详细的帮助页面.校验

help test
Run Code Online (Sandbox Code Playgroud)

...欲获得更多信息.


此外请注意,我是按意图使用,help test而不是man test.这是因为test[有壳内置命令时下.他们的功能设置会有所不同/bin/test,并/bin/[Coreutils的这是在描述的命令man页.

  • 最初,它位于`/ usr/bin/[`并且是`/ usr/bin/test`的硬链接,当被调用为`[`时,你应该包括一个右括号作为最后一个参数.现在它是一个内置的shell. (6认同)
  • 请注意,它们并不完全“完全相同”。`[` 要求它的最后一个参数是 `]`。 (3认同)

Cam*_*ron 14

来自另一个问题:

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


Jah*_*hid 7

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

command arguments separated with space
Run Code Online (Sandbox Code Playgroud)