通常,我在 if 语句中使用方括号:
if [ "$name" = 'Bob' ]; then ...
但是,当我检查是否grep
成功时,我不使用方括号:
if grep -q "$text" $file ; then ...
if
语句中何时需要方括号?
通常,我在 if 语句中使用方括号:
if [ "$name" = 'Bob' ]; then ...
但是,当我检查是否grep
成功时,我不使用方括号:
if grep -q "$text" $file ; then ...
if
语句中何时需要方括号?
方括号是test
命令的同义词。一条if
语句检查命令的退出状态,以决定采用哪个分支。grep -q "$text"
是命令,但"$name" = 'Bob'
不是——它只是一个表达式。test
是一个命令,它接受一个表达式并计算它:
if test "$name" = 'Bob'; then ...
由于方括号是test
命令的同义词,因此您可以将其重写为原始语句:
if [ "$name" = 'Bob' ]; then ...
[
实际上是一个命令,相当于(几乎,见下文)该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
命令。不同之处在于,它的最后一个参数是[
requires ,而不是 - 实际上不允许它(更准确地说,不特殊处理参数;例如,它可能是一个有效的文件名)。(不一定非要这样实现,但如果没有匹配,会让很多人非常非常紧张。)]
test
test
]
[
]
[ ... ]
考虑语法的最好方法是将其视为[
一个程序——它就是!
看一下这个:
~ $ ls /usr/bin/\[
/usr/bin/[
另一方面,你可能没有使用它的那个版本,因为bash
它还提供[
了一个内置的 shell。
无论如何,要回答您的问题:if
运行您给它的命令并查看它的返回值是0
与否。您用于[
进行其他更有趣的比较,例如字符串比较。见man [
和man bash
。