何时在Bash if语句中需要方括号?

时间:2012-01-19 22:02:31

标签: bash if-statement square-bracket

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

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

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

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

if声明中何时需要方括号?

3 个答案:

答案 0 :(得分:100)

方括号是test命令的同义词。 if语句检查命令的退出状态,以决定采用哪个分支。 grep -q "$text"是一个命令,但"$name" = 'Bob'不是 - 它只是一个表达式。 test是一个命令,它接受一个表达式并对其进行求值:

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

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

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

答案 1 :(得分:27)

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

if语句执行命令并在命令成功时执行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则不需要 - 实际上不允许它。 (它没有 以这种方式实现,但是没有匹配[的{​​{1}}会让很多人非常紧张。)

答案 2 :(得分:8)

考虑[ ... ]语法的最佳方法是将[视为一个程序 - 它就是这样!

检查出来:

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

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

无论如何,要回答你的问题:if执行的操作是运行您提供的命令并查看返回值是否为0。您可以使用[进行其他更有趣的比较,例如字符串比较。请参阅man [man bash