5 votes

L'opérateur d'incrémentation ne fonctionne pas sur une variable si cette variable est définie à 0

Augmenter une variable var fonctionne en bash lorsqu'elle est enclose dans des doubles parenthèses comme (( var++ )). Mais j'ai constaté que cela échoue si la variable est définie à 0 au préalable comme var=0.

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

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

Quelqu'un peut-il expliquer ce comportement?

Environnement:

Je utilise gnome-terminal sur Ubuntu Desktop 18.04.5 LTS.

10voto

vanadium Points 56513

Avec crédit d'ici : https://unix.stackexchange.com/questions/146773/why-bash-increment-n-0n-return-error

La valeur de retour de ((expression)) n'indique pas un statut d'erreur, mais, comme le dit la page de manuel de bash :

((expression)) L'expression est évaluée selon les règles décrites ci-dessous dans l'ÉVALUATION ARITHMÉTIQUE. Si la valeur de l'expression est différente de zéro, le statut de retour est 0 ; sinon, le statut de retour est 1. Ceci est exactement équivalent à let "expression".

Dans ((a++)) vous réalisez une post-incrémentation. La valeur de a est 0, donc 1 est retourné, après quoi, elle est incrémentée.

Comparaison

$ unset a
$ ((a++)) ; echo Code de sortie: $? a: $a
Code de sortie: 1 a: 1

par rapport à

$ unset a
$ ((++a)) ; echo Code de sortie: $? a: $a
Code de sortie: 0 a: 1

Une pré-incrémentation, donc a est devenu 1 et 0 est retourné.

5voto

sudodus Points 39902

Cela fonctionne pour moi (dans bash sur Ubuntu),

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

Remarquez la différence avec

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X