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

Bash-if语句中何时需要方括号?,bash,if-statement,square-bracket,Bash,If Statement,Square Bracket,通常,我在if语句中使用方括号: if [ "$name" = 'Bob' ]; then ... if [ "$name" = 'Bob' ]; then ... 但是,当我检查grep是否成功时,我没有使用方括号: if grep -q "$text" $file ; then ... 在if语句中何时需要方括号?[实际上是一个命令,与test命令等效(几乎,见下文)。它不是shell语法的一部分。(两者都[和test,这取决于shell,通常也是内置命令,但这并不影响它们的行为,除了

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

if [ "$name" = 'Bob' ]; then ...
if [ "$name" = 'Bob' ]; then ...
但是,当我检查grep是否成功时,我没有使用方括号:

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

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

[
实际上是一个命令,与
test
命令等效(几乎,见下文)。它不是shell语法的一部分。(两者都
[
test
,这取决于shell,通常也是内置命令,但这并不影响它们的行为,除了性能之外。)

if
语句执行命令,如果命令成功,则执行
部分,如果失败,则执行
else
部分(如果有)。(如果命令退出时状态(
$?
)为0,则命令成功,如果退出时状态为非零,则命令失败。)

命令是

[ "$name" = 'Bob' ]
grep -q "$text" $file
(您可以直接执行相同的命令,而无需使用
if

命令是

[ "$name" = 'Bob' ]
grep -q "$text" $file
man[
man测试
了解更多信息


脚注:嗯,
[
命令几乎等同于
测试
命令。区别在于
[
要求
]
作为其最后一个参数,而
测试
不——事实上不允许它(更准确地说,
测试
不处理
]
参数;例如,它可能是一个有效的文件名)。(它不必以这种方式实现,但是如果
[
没有匹配的
]
会让很多人非常紧张。)

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

if
语句执行命令,如果命令成功,则执行
部分,如果失败,则执行
else
部分(如果有)。(如果命令退出时状态(
$?
)为0,则命令成功,如果退出时状态为非零,则命令失败。)

命令是

[ "$name" = 'Bob' ]
grep -q "$text" $file
(您可以直接执行相同的命令,而无需使用
if

命令是

[ "$name" = 'Bob' ]
grep -q "$text" $file
man[
man测试
了解更多信息


脚注:嗯,
[
命令几乎等同于
测试
命令。区别在于
[
要求
]
作为其最后一个参数,而
测试
不——事实上不允许它(更准确地说,
测试
不处理
]
参数;例如,它可能是一个有效的文件名)。(它不必以这种方式实现,但是如果
[
没有匹配的
]
,会让很多人非常紧张。)方括号是
test
命令的同义词。
if
语句检查命令的退出状态,以决定执行哪个分支。
grep-q“$text”
是命令,但
“$name”='Bob'
不是——它只是一个表达式。
test
是一个命令,它接受一个表达式并对其求值:

if test "$name" = 'Bob'; then ...
由于方括号是
test
命令的同义词,因此可以将其重写为原始语句:

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

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

if test "$name" = 'Bob'; then ...
由于方括号是
test
命令的同义词,因此可以将其重写为原始语句:

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

认为<代码> […] /代码>语法的最好方法是考虑<代码> [< /代码>是一个程序,它是!

看看这个:

~ $ ls /usr/bin/\[ 
/usr/bin/[
另一方面,您可能没有使用该版本,因为
bash
还提供了作为shell内置的
[


无论如何,要回答您的问题:
如果运行您给它的命令并看到它,那么返回值是否为
0
。您可以使用
[
进行其他更有趣的比较,例如字符串比较。请参阅
man[
man bash
思考
[…]的最佳方式语法,是要考虑<代码> [/COD]是一个程序,它是!

看看这个:

~ $ ls /usr/bin/\[ 
/usr/bin/[
另一方面,您可能没有使用该版本,因为
bash
还提供了作为shell内置的
[


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

单方括号可以跨多个shell兼容,但是其中一些shell(包括bash)支持首选的双方括号。有关详细信息,请参阅。另请参阅
帮助'['
单方括号可以跨多个shell兼容,但是其中一些shell(包括Bash)支持首选的双方括号。有关详细信息,请参阅。另请参阅
帮助'['
@chepner:为什么
如果$boolean\u var;那么…
不需要括号?@misha,如果您的
$boolean\u var
具有该值“true”或“false”之所以有效,是因为您正在运行命令
true
false
如果$boolean\u var;那么如果$boolean\u var是
0
1
,则…
不起作用,请参见
man-true
man-false
@derFunk:它会起作用