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))

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.