为什么 bash 增量:`n=0;((n++));` 返回错误?

Aqu*_*wer 17 bash error-handling

n=0;
((n++));echo "ret=$?;n=$n;"
((n++));echo "ret=$?;n=$n;"
((n++));echo "ret=$?;n=$n;"
Run Code Online (Sandbox Code Playgroud)

从那时n=1起,((n++))工作正常,
只有当n=0((n++))返回错误,
而我正在使用trap '' ERR导致问题的一个

这是一些错误吗?

smh*_*ich 16

这是因为 的返回值(( expression ))不用于错误指示。从bash联机帮助页:

((表达式))

表达式是根据下面在ARITHMETIC EVALUATION 中描述的规则进行计算的。如果表达式的值非零,则返回状态为 0;否则返回状态为 1。这完全等同于let " expression "。

所以,你的情况,因为表达式的值零,返回状态(( ... ))是1。


Bru*_*ger 13

原因正如上面的 pmos 所写。

一种解决方案是使用((++n))做增量。您的表达式永远不会计算为零,因此看起来永远不会导致错误。

  • 为了避免陷阱,我做了这个`((n++))&&:`,但是你的答案效果最好,除非`n=-1`,因为“大多数时候”`n=0`它会正常工作:) (2认同)