Der Inkrementoperator funktioniert nicht bei einer Variablen, wenn diese auf 0 gesetzt ist

Der Inkrementoperator funktioniert nicht bei einer Variablen, wenn diese auf 0 gesetzt ist

Das Inkrementieren einer Variable varfunktioniert in Bash, wenn sie in doppelte Klammern eingeschlossen ist, wie (( var++ )). Ich habe jedoch festgestellt, dass es fehlschlägt, wenn die Variable vorher auf 0 gesetzt wurde, wie var=0.

$ a=0
$ ((a++)) && echo "command succeeded" || echo "command failed"
command failed

$ a=1
$ ((a++)) && echo "command succeeded" || echo "command failed"
command succeeded

Kann jemand dieses Verhalten erklären?

Umfeld:

Ich verwende Gnome-Terminal auf Ubuntu Desktop 18.04.5 LTS.

Antwort1

Mit Quellenangabe von hier:https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

Der Rückgabewert von ((Ausdruck)) zeigt keinen Fehlerstatus an, aber aus der Bash-Manpage heißt es:

((Ausdruck)) Der Ausdruck wird gemäß den unten unter ARITHMETISCHE AUSWERTUNG beschriebenen Regeln ausgewertet. Wenn der Wert des Ausdrucks ungleich Null ist, ist der Rückgabestatus 0, andernfalls ist der Rückgabestatus 1. Dies entspricht genau let "Ausdruck".

In ((a++))führen Sie eine Postinkrementierung durch. Der Wert awird 0zurückgegeben 1und anschließend inkrementiert.

Vergleichen

$ unset a
$ ((a++)) ; echo Exitcode: $? a: $a
Exitcode: 1 a: 1

gegen

$ unset a
$ ((++a)) ; echo Exitcode: $? a: $a
Exitcode: 0 a: 1

Ein Vorinkrement, also aist entstanden 1und 0wird zurückgegeben.

Antwort2

Das funktioniert bei mir (in bashUbuntu),

$ a=0
$ echo $((a++))
0
$ echo $((a++))
1
$ echo $((a++))
2
$ echo $((a++))
3
$ echo $a
4

Beachten Sie den Unterschied mit

$ a=0
$ echo $((++a))
1
$ echo $((++a))
2
$ echo $((++a))
3
$ echo $a
3

verwandte Informationen