通常,我在if语句中使用方括号:
if [ "$name" = 'Bob' ]; then ...
但是,当我检查grep
是否成功时,我不使用方括号:
if grep -q "$text" $file ; then ...
if
声明中何时需要方括号?
答案 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
。