什么时候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 。