
Das Inkrementieren einer Variable var
funktioniert 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 a
wird 0
zurückgegeben 1
und 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 a
ist entstanden 1
und 0
wird zurückgegeben.
Antwort2
Das funktioniert bei mir (in bash
Ubuntu),
$ 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