Shell脚本:条件如何计算true或false

时间:2014-06-26 11:19:44

标签: linux bash shell scripting

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 ]

如果这是真的那么我的两个陈述都应该回声,对吗?

3 个答案:

答案 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子句的命令。