On Tue, Nov 24, 2020 at 12:07 AM Jetzer, Bill <jetz...@svaconsulting.com> wrote:
> ((--x)) || echo "err code $? on --x going > from $i to $x"; > > err code 1 on ++x going from -1 to 0 > That's not about --x, but of the ((...)) construct: "" (( expression )) The arithmetic expression is evaluated according to the rules described below (see Shell Arithmetic). If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression" See Bash Builtins, for a full description of the let builtin."" https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs Note the second sentence and try e.g.: $ if (( 100-100 )); then echo true; else echo false; fi false That also matches how truth values work in e.g. C, where you could write if (foo) { ... } to test if foo is nonzero. Also, consider the return values of the comparison operators. The behaviour here makes it possible to implement them by just returning a number, instead of having to deal with a distinct boolean type that would affect the exit status: $ (( a = 0 < 1 )); echo $a 1 > err code 1 on x++ going from 0 to 1 As to why you get this here, when going to one instead of zero, remember the post-increment returns the original value.