什么时候Bash if语句需要方括号?

通常,我在if语句中使用方括号:

if [ "$name" = 'Bob' ]; then ... 

但是,当我检查如果grep成功,我不使用方括号:

 if grep -q "$text" $file ; then ... 

if语句中的方括号是什么时候需要的?

方括号是test命令的同义词。 if语句检查命令的退出状态,以决定采取哪个分支。 grep -q "$text"是一个命令,但是"$name" = 'Bob'不是 – 它只是一个expression式。 test是一个命令,需要一个expression式并对其进行评估:

 if test "$name" = 'Bob'; then ... 

由于方括号是test命令的同义词,因此可以将其重写为原始语句:

 if [ "$name" = 'Bob' ]; then ... 

[实际上是一个命令,相当于(几乎见下文) test命令。 这不是shell语法的一部分。 (这两个[test ,取决于壳,通常也是内置的命令,但是这不会影响他们的行为,除了性能可能。

一个if语句执行一个命令,如果命令执行成功then执行then部分,否则执行else部分(如果有的话)。 (如果状态( $? )为0,则命令成功,如果以非零状态退出,则失败。)

 if [ "$name" = 'Bob' ]; then ... 

该命令是

 [ "$name" = 'Bob' ] 

(你可以直接执行相同的命令,不用if 。)

 if grep -q "$text" $file ; then ... 

该命令是

 grep -q "$text" $file 

man [man test更多的信息。

注意: [命令几乎等同于test命令。 不同之处在于[需要]作为最后一个参数,而test不能 – 实际上不允许。 (不必这样去实施,但是没有匹配就会让很多人非常紧张)。

考虑语法的最好方法是考虑[是一个程序 – 它是什么!

看一下这个:

 ~ $ ls /usr/bin/\[ /usr/bin/[ 

另一方面,你可能不使用它的版本,因为bash还提供了[作为内置的shell。

无论如何,要回答你的问题: if是运行你给它的命令,看看它的返回值是否为0 。 您可以使用[进行其他更有趣的比较,如string比较。 见man [man bash