为什么当计算结果等于0时'let'以代码1退出?

Ale*_*kov 9 bash math exit-status

我遇到了这个问题,其作者处理了由以下原因引起的问题: let x=1-1exit with code 1。

根据bash 手册

如果最后一个表达式的计算结果为 0,则 let 返回 1;否则返回 0。(第 56-57 页)

我不太熟悉 bash 的细微差别,所以我的问题是“这种行为的原因是什么?”。可能是因为 0 解释为“假”?对于像我这样的 bash 初学者来说,这有点奇怪,算术表达式的结果 0 会导致错误退出代码......

Kus*_*nda 14

在大多数通用编程语言的布尔上下文中使用时,零整数值的计算结果为false 。这一事实意味着您可能拥有类似于以下 C 代码的代码。

c = 100;
while (--c) { /* do something while c is non-zero */ }
Run Code Online (Sandbox Code Playgroud)

在 shell 中,当在条件上下文中使用时,退出状态 1 的计算结果为false 。

c=100
while let --c; do
    # do something while c is non-zero
done
Run Code Online (Sandbox Code Playgroud)

你看到这里的模式了吗?循环while运行直到let返回非零退出状态,当c达到零时它会执行此操作。在这种情况下,非零退出状态并不意味着“错误”,它仅意味着let到达结果0

不过,现在通常let被替换为((...))(算术评估),如

c=100
while ((--c)); do ...; done
Run Code Online (Sandbox Code Playgroud)

值得重复的是,while上面的循环并不关心c. 他们关心内置let实用程序和((...)).

  • 另请注意`1 + 1 == 2`或`5 < 6`算术表达式如何产生`1`和`6 < 5`,`1 + 1 == 3`产生0,你可以用`echo "检查$(( 1 + 1 == 2 ))"` 或 `(( a = 1 + 1 == 2 )); 回声“$a$?”` (2认同)