5 votes

L'opérateur d'incrémentation ne fonctionne pas sur une variable si celle-ci est fixée à 0

Incrémenter une variable var fonctionne en bash lorsqu'il est entouré de doubles parenthèses comme (( var++ )) . Mais j'ai constaté que l'opération échoue si la variable est préalablement fixée à 0, comme dans le cas suivant 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 ?

L'environnement :

J'utilise gnome-terminal sur Ubuntu Desktop 18.04.5 LTS.

10voto

vanadium Points 56513

Avec le 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, d'après la page de manuel de bash :

((expression)) L'expression est évaluée selon les règles décrites ci-dessous dans la section ÉVALUATION ARITHMETIQUE. Si la valeur de l'expression est non nulle, l'état de retour est 0 ; sinon, l'état de retour est 1. Ceci est exactement équivalent à let "expression".

En ((a++)) vous faites une incrémentation de poste. La valeur de a es 0 así que 1 est renvoyée, puis elle est incrémentée.

Comparer

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

contre

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

Une pré-incrémentation, donc a est devenu 1 y 0 est renvoyée.

5voto

sudodus Points 39902

Cela fonctionne pour moi (en bash dans 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