Quelques commandes liées à l'arithmétique, Dash, shell POSIX, sh, Increment

17

Lors de la pré / post incrémentation d'une variable, dans POSIX Shell, quelle est la différence entre ces deux exemples. Ils semblent avoir les mêmes conséquences, mais seraient-ils utilisés différemment? Quand préférez-vous l'un plutôt que l'autre?

X=$((X+1))

: $((X=X+1))
JM Becker
la source

Réponses:

18

Dans votre premier exemple, $((X+1))évalue l'expression X + 1 et développe le résultat, qui est ensuite assigné à la variable.

Dans le deuxième exemple, par $((X=X+1))incréments Xd'une unité ( $((X++))est également valable et plus courte, mais pas nécessairement pris en charge par l'enveloppe), puis se dilate à la nouvelle valeur de $Xqui est le premier argument de la commande null, :. La commande null ignore ses arguments et le résultat est rejeté (avec effets secondaires).

Je préférerais personnellement la première forme pour trois raisons (relativement subjectives):

  • La commande null est obscure et mal comprise, comme indiqué par le fait qu'elle fait souvent l'objet de questions confuses ici.
  • La première forme semble plus naturelle en termes de grammaire globale du shell, et ressemble même un peu à l'ancien style d'évaluation.
  • Le premier formulaire est plus clair et plus concis et n'implique pas de commande.

Vous devez utiliser la première version si vous modifiez l'environnement d'une seule commande comme

X=$((X+1)) /usr/local/bin/something

Vous devez utiliser le deuxième formulaire pour ajouter directement une évaluation aux arguments:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

Cela a les effets secondaires souhaités, enregistre une ligne et est assez clair.

Alexios
la source