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