bash 将如何计算以下代码

bash 将如何计算以下代码

这个问题有两个部分:

(a) 了解被截断的代码正在做什么

(b) 理解两者之间的区别退出状态返回状态在 的背景下bash

这是我试图理解的代码片段:

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

运行这个会产生False.我不明白为什么会发生这种情况。

如果我理解正确的话,这种情况可能会发生if

(a)var=-2创建退出状态 0,因为分配成功

(b)(( var+=2 ))将 的值加 2 var,并且表达式的计算结果为零。因此本学期的退出状态为 1

if(c) 0 && 1 创建 0 的存在状态,然后由构造使用

if构造应该简单地检查退出状态,当它为零时,它会采取然后小路。在上面的步骤 (c) 中,它为零,但脚本仍然采用别的小路。这是理解这一点的正确方法吗?

另外,我不断看到各种bash文本使用退出状态返回状态可以互换。

我怀疑var=-2分配会有任何类型的退出状态,因为它不是一个程序。但任何对两者之间差异的澄清都会很棒。

答案1

那是:

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi

这是如果第一个命令列表返回时运行第二个命令列表真的/成功(零)退出状态,即最后运行的命令返回的退出状态为零。

在:

var=-2 && ((var += 2))

这是只有成功后才运行的cmd1 && cmd2地方。cmd2cmd1

var=-2

只要$var尚未设为只读,通常就会成功,因此((var += 2))将运行该命令:

((arithmetic expression))

退货成功/真的只要表达式计算正确(无语法错误)并且表达式的结果非零。

  • ((123)), ((1 + 1)),((1 == 1))返回真
  • ((0)), ((-2 + 2)),((2 == -2))返回假。
  • ((4294967296 * 4294967296))由于 64 位整数换行,在大多数 shell 中返回 false

var += 2作为算术表达式,执行赋值并解析为被赋值的值,此处为 0,因此错误的退出状态。

您可以使用算术扩展语法查看基于退出状态的值$((...))

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0

或者将其分配给变量:

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0

$?包含上一个命令的退出状态。if///而言,0 表示 true then,其他值表示 false elsefi

这里的混乱来自于这样一个事实:对于算术表达式,它是相反的:0意味着假,而其他任何东西都意味着真(例如,2 == 2is 1while 2 < 1is 0)。

为了避免担心差异,只需忘记$?及其可能的值即可。只需用布尔值来思考真的/错误的,成功/失败

 grep -q foo file

foo如果在 中找到则返回 true file

 [ "$a" = "$b" ]

$a如果包含与 相同的内容,则返回 true $b

 ((6 * 3 - 12))
 ((4 == 1))

如果算术表达式的结果是非零数字,则返回 true。

那些是否并不重要真的/错误的以这些grep/[命令或((...))构造的退出状态 0 或 1 表示。

答案2

if(c) 0 && 1 创建 0 的存在状态,然后由构造使用

那里有错误。 0 && 1 结果为1.请记住,这不是 C 或 Java。在 shell 中 0 && 1 是你从 得到的true && false

$ true; echo $?
0
$ false; echo $?
1
$ true && false; echo $?
1

另外,我不断看到各种 bash 文本交替使用退出状态和返回状态。

它们是可以互换的。您要记住的是,0表示成功,不0表示失败。它与大多数编程语言相反,即0false 和1true。

答案3

一切都按预期进行。

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

代码解释:-

if var=-2 && (( var+=2 ))

var=-2 => true 值非零,因此评估为 true

var+=2 => false 值为零,因此评估为 false

这就像

if true && false

根据逻辑计算真 && 假 => 假

在这种情况下,这是我们的最终代码

if (false)
then
    echo "True"
else
    echo "False"
fi

相关内容