Mis*_*hko 58 bash if-statement square-bracket
通常,我在if语句中使用方括号:
if [ "$name" = 'Bob' ]; then ...
Run Code Online (Sandbox Code Playgroud)
但是,当我检查是否grep
成功时,我不使用方括号:
if grep -q "$text" $file ; then ...
Run Code Online (Sandbox Code Playgroud)
声明中何时需要方括号if
?
che*_*ner 106
方括号是test
命令的同义词.一个if
语句检查,以决定采取哪一个分支指令的退出状态.grep -q "$text"
是一个命令,但"$name" = 'Bob'
不是 - 它只是一个表达.test
是一个命令,它接受一个表达式并对其进行求值:
if test "$name" = 'Bob'; then ...
Run Code Online (Sandbox Code Playgroud)
由于方括号是test
命令的同义词,因此您可以将其重写为原始语句:
if [ "$name" = 'Bob' ]; then ...
Run Code Online (Sandbox Code Playgroud)
Kei*_*son 27
[
实际上是一个命令,等同于(几乎,见下文)test
命令.它不是shell语法的一部分.([
并且test
,取决于shell,它们通常也是内置命令,但这不会影响它们的行为,除了性能之外.)
一个if
语句执行的命令和执行then
如果命令成功的一部分,或者else
一部分(如果有的话),如果它失败.(如果命令以status($?
)为0 退出,则命令成功,如果以非零状态退出则失败.)
在
if [ "$name" = 'Bob' ]; then ...
Run Code Online (Sandbox Code Playgroud)
命令是
[ "$name" = 'Bob' ]
Run Code Online (Sandbox Code Playgroud)
(您可以直接执行相同的命令,不使用if
.)
在
if grep -q "$text" $file ; then ...
Run Code Online (Sandbox Code Playgroud)
命令是
grep -q "$text" $file
Run Code Online (Sandbox Code Playgroud)
man [
或man test
了解更多信息.
脚注:嗯,[
命令几乎等同于test
命令.不同之处在于它[
需要]
作为最后一个参数,而test
不是 - 事实上它不允许它.(它没有已经被实现这种方式,但一个[
不匹配]
会作出很多人非常非常紧张.)
想到[ ... ]
语法的最好方法是考虑[
成为一个程序 - 它就是这样!
看一下这个:
~ $ ls /usr/bin/\[
/usr/bin/[
Run Code Online (Sandbox Code Playgroud)
另一方面,你可能没有使用它的那个版本,因为它bash
也提供[
了内置的shell.
无论如何,要回答你的问题:if
运行你给它的命令是什么,并看到它的返回值是否0
.您可以使用[
其他更有趣的比较,例如字符串比较.见man [
和man bash
.