【问题标题】:If statement with arithmetic comparison behaviour in bashbash 中具有算术比较行为的 if 语句
【发布时间】:2023-03-31 09:29:02
【问题描述】:

我正在学习 bash,但发现了一些我(还)无法解释的奇怪现象。在学校,我了解到 if 语句将 0 评估为真,将 1 评估为假,因此它可以与来自其他命令的状态代码一起使用。现在是我的问题:为什么会这样:

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 怎么知道我使用的是算术表达式而不是其他命令?

【问题讨论】:

    标签: bash


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      另一方面,

      ((...)) 是一个算术语句。它本身就是一个命令,它的工作原理是将其主体评估为算术表达式,然后查看结果值。如果值为真,则命令成功,退出状态为 0。如果值为假,则命令失败,退出状态为 1。

      在学习bash 时最好不要将if 语句、while 循环等中的条件视为真或假,而是将命令视为成功或失败。毕竟,shell 语言不是为数据处理而设计的。它们是运行其他程序的胶水语言。

      【讨论】:

      • 嗯,好像我在回答中使用了一些不正确的术语。我希望你不介意我编辑使用正确的。
      【解决方案3】:

      来自bash 手册:

      ((expression))

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-20
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2016-07-27
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多