“if
”关键字检查以确定是/否的内部环境变量或内容。
我有两个以下的陈述。 abc
已装入,但不是pqr
。
if mount |grep -q "abc"; then echo "export pqr"; fi
if mount |grep -q "pqr"; then echo "export abc"; fi
在上面的例子中,我预计第一个语句在abc
被挂载后什么都不做(所以在mount o / p中找到行),因此$?
之后的mount |grep -q "abc"
为0。
我期望第二个语句执行回声。但它正在发生,否则,第一个声明是印刷,但第二个不是。所以想要了解在什么基础上决定是/否。
Here is one related question
但该问题的接受答案是:
if [ 0 ]
is equivalent to
if [ 1 ]
如果这是真的那么我的两个陈述都应该回声,对吗?
答案 0 :(得分:3)
您发出的命令与您从引用的问题中提取的类比之间存在基本差异。
使用grep
选项执行-q
时,如果找到匹配,则退出时返回代码为零。这意味着如果mount
的输出包含abc
,那么
if mount |grep -q "abc"; then echo "export pqr"; fi
相当于说:
if true; then echo "export pqr"; fi
请注意,此处没有test
命令,即[
。
引用manual:
test
和[
内置函数使用集合评估条件表达式 基于参数数量的规则。0个参数
The expression is false.
1参数
The expression is true if and only if the argument is not null.
这解释了为什么[ 0 ]
和[ 1 ]
都评估为真。
答案 1 :(得分:1)
if
命令不像C语言那样对整数的“布尔值”起作用:它作用于后面命令的退出状态。在shell中,退出状态为0被视为成功,任何其他退出状态为失败。如果if
后面的命令以状态0退出,那就是“true”
示例:
$ test -f /etc/passwd; echo $?
0
$ test -f /etc/doesnotexist; echo $?
1
$ if test -f /etc/passwd; then echo exists; else echo does not exist; fi
exists
$ if test -f /etc/doesnotexist; then echo exists; else echo does not exist; fi
does not exist
请注意,[
和[[
是(基本上)命令(基本上)别名test
答案 2 :(得分:0)
if [ 0 ]
测试以查看字符串0
是否为非空。它是非空的,因此测试成功。同样,if [ 1 ]
成功,因为字符串1
非空。 [
命令(也称为test
)基于其参数返回值。同样,grep返回一个值
if
关键字使shell根据命令返回的值执行命令,但命令的输出前面跟if
无关。
命令test 0
(相当于命令[ 0 ]
返回值0.命令test 1
也返回值0.零被shell视为成功,所以执行if
子句的命令。