<Précédent | Table des matières | Suivant>
Affectation
Bien que ses utilisations ne soient pas immédiatement apparentes, les expressions arithmétiques peuvent effectuer une affectation. Nous avons effectué des missions à plusieurs reprises, mais dans un contexte différent. Chaque fois que nous donnons une valeur à une variable, nous effectuons une affectation. On peut aussi le faire au sein d'expressions arithmétiques :
[moi@linuxbox ~]$ truc=
[moi@linuxbox ~]$ écho $foo
[moi@linuxbox ~]$ si (( foo = 5 )); then echo "C'est vrai."; Fi
C'est vrai.
[moi@linuxbox ~]$ écho $foo
5
[moi@linuxbox ~]$ truc=
[moi@linuxbox ~]$ écho $foo
[moi@linuxbox ~]$ si (( foo = 5 )); then echo "C'est vrai."; Fi
C'est vrai.
[moi@linuxbox ~]$ écho $foo
5
Dans l'exemple ci-dessus, nous affectons d'abord une valeur vide à la variable foo et vérifiez qu'il est bien vide. Ensuite, nous effectuons une if avec la commande composée (( foo = 5
)). Ce processus fait deux choses intéressantes : 1) il attribue la valeur de 5 à la variable
foo, et 2) il est évalué à true car foo a reçu une valeur différente de zéro.
Remarque: Il est important de se souvenir de la signification exacte de = dans l'expression ci-dessus. Un seul = effectue la mission. toto = 5 dit "faire foo égal à 5 », tandis que == évalue l'équivalence. toto == 5 dit "est-ce que foo égal à 5 ? » C'est une caractéristique commune à de nombreux langages de programmation. Dans le shell, cela peut être un peu déroutant car le tester la commande accepte un seul = pour l'équivalence de chaîne. Encore une autre raison d'utiliser le plus moderne [[]] et les (( )) commandes composées à la place de tester.
En plus de la =, le shell fournit également des notations qui effectuent des tâches très utiles :
Tableau 34-4 : Opérateurs d'affectation
Notation Description
Notation Description
paramètre = Plus-value Affectation simple. Attribue Plus-value à paramètre.
paramètre += Plus-value Une addition. Équivalent à paramètre = paramètre +
valeur.
paramètre -= Plus-value Soustraction. Équivalent à paramètre = paramètre -
valeur.
paramètre *= Plus-value Multiplication. Équivalent à paramètre = paramètre
* valeur.
paramètre /= Plus-value Division entière. Équivalent à paramètre =
paramètre / valeur.
paramètre %= Plus-value Modulo. Équivalent à paramètre = paramètre %
valeur.
paramètre++ Post-incrément variable. Équivalent à paramètre =
paramètre + 1 (cependant, voir la discussion ci-dessous).
paramètre−− Post-décrémentation variable. Équivalent à paramètre =
paramètre − 1.
++paramètre Pré-incrément variable. Équivalent à paramètre =
paramètre + 1.
--paramètre Pré-décrément variable. Équivalent à paramètre =
paramètre − 1.
Ces opérateurs d'affectation fournissent un raccourci pratique pour de nombreuses tâches arithmétiques courantes. L'incrément (++) et décrémenter (−−) opérateurs, qui augmentent ou diminuent la valeur de leurs paramètres d'une unité. Ce style de notation est tiré du langage de programmation C et a été incorporé dans un certain nombre d'autres langages de programmation, y compris bash.
Les opérateurs peuvent apparaître soit au début d'un paramètre, soit à la fin. Bien qu'ils incrémentent ou décrémentent tous les deux le paramètre de un, les deux placements présentent une différence subtile. S'il est placé au début du paramètre, le paramètre est incrémenté (ou décrémenté) avant que le paramètre ne soit renvoyé. Si placé après, l'opération est effectuée après le paramètre est retourné. C'est assez étrange, mais c'est le comportement voulu. Voici une démonstration :
[moi@linuxbox ~]$ truc=1 [moi@linuxbox ~]$ écho $((foo++)) 1
[moi@linuxbox ~]$ écho $foo
[moi@linuxbox ~]$ truc=1 [moi@linuxbox ~]$ écho $((foo++)) 1
[moi@linuxbox ~]$ écho $foo
2
2
Si nous attribuons la valeur de un à la variable foo puis l'incrémenter avec le ++ opérateur placé après le nom du paramètre, foo est renvoyé avec la valeur un. Cependant, si nous regardons la valeur de la variable une deuxième fois, nous voyons la valeur incrémentée. Si nous plaçons le ++ opérateur devant le paramètre, nous obtenons le comportement le plus attendu :
[moi@linuxbox ~]$ truc=1 [moi@linuxbox ~]$ écho $((++foo)) 2
[moi@linuxbox ~]$ écho $foo
2
[moi@linuxbox ~]$ truc=1 [moi@linuxbox ~]$ écho $((++foo)) 2
[moi@linuxbox ~]$ écho $foo
2
Pour la plupart des applications shell, le préfixe de l'opérateur sera le plus utile.
Les opérateurs ++ et -- sont souvent utilisés en conjonction avec des boucles. Nous allons apporter quelques améliorations à notre script modulo pour le resserrer un peu :
#! / Bin / bash
# modulo2 : démontre l'opérateur modulo pour ((i = 0; i <= 20; ++je )); faire
si (((je % 5) == 0 )); puis printf "<%d> " $i
d'autre
printf "%d " $i
fi fait
printf "\ n"
#! / Bin / bash
# modulo2 : démontre l'opérateur modulo pour ((i = 0; i <= 20; ++je )); faire
si (((je % 5) == 0 )); puis printf "<%d> " $i
d'autre
printf "%d " $i
fi fait
printf "\ n"