我试图编写一个使用if
语句的Bash脚本。
if[$CHOICE -eq 1];
在我加入以下空格后,脚本就不会再出现错误:[
前后各一个空格以及]
前面一个空格。
if [ $CHOICE -eq 1 ];
我在这里提出的问题是,为什么Bash中方括号周围的空格很重要?
我试图编写一个使用if
语句的Bash脚本。
if[$CHOICE -eq 1];
在我加入以下空格后,脚本就不会再出现错误:[
前后各一个空格以及]
前面一个空格。
if [ $CHOICE -eq 1 ];
我在这里提出的问题是,为什么Bash中方括号周围的空格很重要?
一旦你掌握了[
是一个命令,很多东西就会变得更加清晰!
[
是另一种拼写"test
"的方式。
help [
然而,虽然它们执行的功能完全相同,但test
命令拥有一个更加详细的帮助页面。请检查。
help test
...获取更多信息。
此外,请注意我故意使用help test
而不是man test
。这是因为test
和[
现在是shell内置命令。它们的功能集可能不同于man
页中描述的核心实用程序/bin/test
和/bin/[
。
/usr/bin/[
,是指向/usr/bin/test
的硬链接,当使用[
命令调用时,需要在最后一个参数中包含闭括号。现在它已经成为了shell内置命令。 - Benoit[
命令要求其最后一个参数为 ]
。 - William Pursell来自另一个问题:
历史上,这是因为'['不是shell内置的命令,而是一个单独的可执行文件,它接收表达式作为参数并返回结果。如果您没有将'['用空格包围,则shell会在$PATH中搜索不同的文件名(并且找不到它)。 - Andrew Medico Jun 24 '09 at 1:13
[
是一个命令,$CHOICE
应该是它的参数。但是,通过这样做 [$CHOICE
(在 [
和 $CHOICE
之间没有任何空格),你尝试运行一个名为 [$CHOICE
的命令。命令的语法如下:
command arguments separated with space
[
是一个测试命令。因此需要空格。
$ echo [12345]
[12345]
$ echo oops >3
$ echo [12345]
3
[12345]
匹配的文件,所以shell将其保留为未扩展的形式。但是当存在名为3
的文件时,通配符就会扩展成它。 - tripleee
if command; then commands_if_exit_code_is_0; else commands_if_exit_code_is_nonzero; fi;
。*command
* 可以是任何命令,而[
只是其中之一。 - Benoit$CHOICE
是"foo"
,那么你正在尝试运行命令["foo"]
。 - tripleee[[
遵循相同的要求;您需要在两侧添加空格,并且命令需要以]]
结尾。双倍版本有点更加灵活和强大;请参阅上面 @codeforester 的链接以获取更细致的讨论。 - tripleee