如果语句在bash中具有算术比较行为

时间:2015-05-08 13:14:40

标签: bash

我正在学习bash,我注意到一些我不能解释的奇怪事情。在学校,我了解到if语句将0评估​​为true,将1评估为false,因此可以将其与其他命令的状态代码一起使用。现在是我的问题:为什么会发生这种情况:

echo $((5>2)) #prints 1
echo $((5<2)) #prints 0
if ((5>2)) ; then echo "yes" ; else echo "no" ; fi #prints yes
if ((5<2)) ; then echo "yes" ; else echo "no" ; fi #prints no

这似乎不符合逻辑。 bash如何知道我使用的是算术表达而不是另一个命令?

3 个答案:

答案 0 :(得分:7)

您混淆了命令替换的输出和算术上下文的返回值。

命令替换的输出为1为真,0为假。

如果结果为真(即非零),则(( ))的返回值为0(成功),如果结果为假,则返回1。

if查看返回值,而不是命令的输出。

答案 1 :(得分:2)

来自bash手册:

  

((expression))

     

根据ARITHMETIC EVALUATION下面描述的规则评估表达式。 如果表达式的值非零,则返回状态为0;否则返回状态为1 。 (我的重点。)

所以基本上在布尔上下文中((expression))给出了$((expression))给出的反函数。

答案 2 :(得分:2)

$((...))是算术表达式;它扩展为括号内表达式的值。由于它不是命令,因此它没有自己的退出状态或返回值。如果布尔表达式为真,则求值为1,如果为假则为0。

另一方面,

((...))是算术语句。它本身就是一个命令,它可以将其身体作为算术表达式进行评估,然后查看结果值。如果值为true,则命令成功并且退出状态为0.如果值为false,则命令失败,退出状态为1。 / p>

在学习bash以停止将if语句,while循环等中的条件视为真或假时,这是一个好主意,但是如果命令成功或失败。毕竟,shell语言不是为数据处理而设计的;它们是运行其他程序的粘合语言。

相关问题