Ich vermute, dass dies beabsichtigt ist (und nicht nur ein Fehler). Wenn ja, verweisen Sie mich bitte für eine Begründung auf die entsprechende Dokumentation.
~$ i=0; ((i++)) && echo true || echo false
false
~$ i=1; ((i++)) && echo true || echo false
true
Der einzige Unterschied zwischen den beiden Zeilen ist i=0
vs.i=1
Antwort1
Dies liegt daran i++
,
Nachinkrement, wie in beschrieben man bash
. Das bedeutet, dass der Wert des Ausdrucks derOriginalWert von i
, nicht der erhöhte Wert.
ARITHMETIC EVALUATION
The shell allows arithmetic expressions to be evaluated, under certain circumstances (see the let and
declare builtin commands and Arithmetic Expansion). Evaluation is done in fixed-width integers with no
check for overflow, though division by 0 is trapped and flagged as an error. The operators and their prece-
dence, associativity, and values are the same as in the C language. The following list of operators is
grouped into levels of equal-precedence operators. The levels are listed in order of decreasing precedence.
id++ id--
variable post-increment and post-decrement
So dass:
i=0; ((i++)) && echo true || echo false
verhält sich wie:
i=0; ((0)) && echo true || echo false
außer dass i
auch erhöht wird; und dass:
i=1; ((i++)) && echo true || echo false
verhält sich wie:
i=1; ((1)) && echo true || echo false
außer dass es i
auch erhöht wird.
Der Rückgabewert der (( ))
Konstruktion ist „truey ( 0
), wenn der Wert ungleich Null ist, und umgekehrt.
Sie können auch testen, wie der Post-Increment-Operator funktioniert:
$ i=0
$ echo $((i++))
0
$ echo $i
1
Und zum Vergleich vorinkrementieren:
$ i=0
$ echo $((++i))
1
$ echo $i
1
Antwort2
]# i=0; ((i++)) && echo true || echo false
false
]# i=0; ((++i)) && echo true || echo false
true
Der Rückgabewert ((expression))
hängt vom Präfix oder Postfix ab. Die Logik ist dann folgende:
((expression))
The expression is evaluated according to the rules described be low under ARITHMETIC EVALUATION.
If the value of the expression is non-zero,
the return status is 0;
otherwise the return status is 1.
Dies bedeutet, dass es in den Normalzustand zurückversetzt wird und nicht wie ein Rückgabewert aussieht.