速记增量符号的 Bash 退出状态

标签 bash shorthand exitstatus

我注意到 bash 的 (( )) 表示法的返回状态有一个明显的不一致。
考虑以下内容

$> A=0
$> ((A=A+1))
$> echo $? $A
0 1

但是使用其他众所周知的速记增量符号会产生:

$> A=0
$> ((A++))
$> echo $? $A
1 1

如果在脚本中有内置的 set -e,第二个符号将导致脚本退出,因为 ((A++)) 的退出状态返回非零。 this related question 或多或少地解决了这个问题.但它似乎并没有解释两种符号 ((A=A+1))((A++))

退出状态的差异

((A++)) 似乎返回 1 当且仅当 A 等于 0 时。 (免责声明:我没有做过详尽的测试。在 bash 4.1.2 和 4.2.25 中测试过)。所以最后一个问题归结为:

为什么 A=0; ((A++)) 返回 1?

最佳答案

a++ 是后递增的:它在语句求值后递增。相比之下,++a 之前递增。因此:

$ a=0 ; ((a++)) ; echo $a $?
1 1
$ a=0 ; ((++a)) ; echo $a $?
1 0

在第一种情况下,((a++)),首先计算算术表达式,而 a 仍然为零,产生零值(因此产生 a非零返回状态)。然后,a 递增。

在第二种情况下,((++a))a递增到1,然后((...))被评估。由于计算算术表达式时 a 不为零,因此返回状态为零。

来自 man bash:

   id++ id--
          variable post-increment and post-decrement
   ++id --id
          variable pre-increment and pre-decrement

关于速记增量符号的 Bash 退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428894/

相关文章:

bash - 伯恩外壳 : Graceful way to get exit status

linux - linux命令返回的退出状态1的含义

linux - 如何在 bash 中通过脚本将第二行打印到输出中

linux - 如何使用 bash 遍历日志文件的最后 5 分钟

Java数学运算简写?

如果对象存在,则调用方法的 Javascript 速记

Shell脚本调用vim编辑器,获取退出方法

bash - 如何从 bash 函数中打印换行符

c# - 从 Mono C# 运行 Bash 命令

javascript - 如果没有 "function"关键字,这个对象方法定义如何工作?