Inkrementierung von Bash-Variablen, inkonsistentes Verhalten

Inkrementierung von Bash-Variablen, inkonsistentes Verhalten

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=0vs.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 iauch 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 iauch 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.

verwandte Informationen