Initialiser ou changer la valeur d'une variable
Opérateur d'affectation à buts multiples, qui fonctionne à la fois pour les affectations arithmétiques et de chaînes de caractères.
var=27 categorie=mineraux # Pas d'espaces permit après le "=". |
![]() | Ne confondez pas l'opérateur d'affectation << = >> avec l'opérateur de test =.
|
plus
moins
multiplication
division
exponentielle
# Bash, version 2.02, introduit l'opérateur exponentielle "**". let "z=5**3" echo "z = $z" # z = 125 |
modulo, ou mod (renvoie le reste de la division d'un entier)
bash$ echo `expr 5 % 3` 2 |
Cet opérateur trouve son utilité dans, entre autres choses, la génération de nombres compris dans une échelle donnée (voir Exemple 9-23 et Exemple 9-25) et pour le formattage de la sortie d'un programme (voir Exemple 26-8 et Exemple A-7). Il peut même être utiliser pour générer des nombres premiers (voir Exemple A-17). L'opérateur Modulo revient, de manière surprenante, assez souvent dans de nombreuses astuces numériques.
Exemple 8-1. Plus grand diviseur commun
#!/bin/bash # gcd.sh: plus grand diviseur commun # Utilise l'algorithme d'Euclide # Le "plus grand diviseur commun" (pgcd) de deux entiers est l'entier le plus #+ important qui divisera les deux sans reste. # L'algorihtme d'Euclide utilise des divisions successives. # A chaque passe, #+ dividende <--- diviseur #+ diviseur <--- reste #+ jusqu'à ce que reste 0. #+ pgcd = dividende, à la dernière passe. # # Pour une excellente discussion de l'algorithme d'Euclide, voir le site # de Jim Loy, http://www.jimloy.com/number/euclids.htm. # ------------------------------------------------------ # Vérification des arguments ARGS=2 E_MAUVAISARGS=65 if [ $# -ne "$ARGS" ] then echo "Usage: `basename $0` premier_nombre deuxieme-nombre" exit $E_MAUVAISARGS fi # ------------------------------------------------------ pgcd () { # Affectation arbitraire. dividende=$1 # Cela ne fait rien lequel est le diviseur=$2 #+ plus importante. # Pourquoi? reste=1 # Si une variable non initialisée est utilisée #+ dans la boucle, #+ cela finit en un message d'erreur lors de #+ la première passe dans la boucle. until [ "$reste" -eq 0 ] do let "reste = $dividende % $diviseur" dividende=$diviseur # Maintenant, répétez avec les deux plus #+ petits nombres. diviseur=$reste done # Algorithme d'Euclide } # Le dernier $dividende est le pgcd. pgcd $1 $2 echo; echo "PGCD de $1 et $2 = $dividende"; echo # Exercice : # -------- # Vérifier les arguments en ligne de commande pour s'assurer qu'ils sont des #+ entiers et quitter le script avec une erreur appropriée le cas contraire. exit 0 |
<< plus-égal >> (incrémente une variable par une constante)
let "var += 5" renvoie dans var sa propre valeur incrémentée de 5.
<< moins-égal >> (décrémente une variable par une constante)
<< multiplication-égal >> (multiplie une variable par une constante)
let "var *= 4" renvoie dans var sa propre valeur multipliée par 4.
<< division-égal >> (divise une variable par une constante)
<< modulo-égal >> (reste de la division de la variable avec une constante)
Les opérateurs arithmétiques sont trouvés souvent dans une expression expr ou let.
Exemple 8-2. Utiliser des opérations arithmétiques
#!/bin/bash # Compter jusqu'à 6 de 5 façons différentes. n=1; echo -n "$n " let "n = $n + 1" # let "n = n + 1" fonctionne aussi. echo -n "$n " : $((n = $n + 1)) # ":" nécessaire parce que sinon Bash essaie d'interpréter #+ "$((n = $n + 1))" comme une commande. echo -n "$n " n=$(($n + 1)) echo -n "$n " : $[ n = $n + 1 ] # ":" nécessaire parce que sinon Bash essaie d'interpréter #+ "$[ n = $n + 1 ]" comme une commande. # Fonctionne même si "n" a été initialisé comme une chaîne de caractères. echo -n "$n " n=$[ $n + 1 ] # Fonctionne même si "n" a été initialisé comme une chaîne de caractères. #* Eviter ce type de construction, car elle est obsolète et non portable. echo -n "$n "; echo # Merci, Stephane Chazelas. exit 0 |
![]() | Les variables de type entier dans Bash sont réellement de type entier long signé (32-bit), dans la plage -2147483648 à 2147483647. Une opération qui prend une variable en dehors de ces limites donnera un résultat erroné.
|
![]() | Bash ne comprend pas l'arithmérique à virgule flottante. Il traite les nombres contenant un point décimal comme des chaînes de caractères.
|
opérateurs de bits. Les opérateurs de bits font rarement une apparition dans les scripts shell. Leur utilisation principale semble d'être la manipulation et le test de valeurs lues à partir de ports ou de sockets. Le << renversement de bit >> est plus intéressant pour les langages compilés, comme le C et le C++, qui fonctionnent assez rapidement pour permettre une utilisation en temps réel.
décalage gauche d'un bit (revient à multiplier par 2 pour chaque décalage)
<< décalage gauche-égal >>
let "var <<= 2" renvoie dans var sa propre valeur décalée à gauche de 2 bits (donc multipliée par 4)
décalage droit d'un bit (revient à diviser par 2 pour chaque position du décalage)
<< décalage droit-égal >> (inverse de >>=)
et binaire
<< et-égal binaire >>
OU binaire
<< OU-égal binaire >>
négation binaire
NON binaire
XOR binaire
<< XOR-égal binaire >>
et (logique)
if [ $condition1 ] && [ $condition2 ] # Identique à: if [ $condition1 -a $condition2 ] # Renvoie vrai si à la fois condition1 et condition2 sont vraies... if [[ $condition1 && $condition2 ]] # Fonctionne aussi. # Notez que l'opérateur && n'est pas autorisé dans une construction [ ... ]. |
![]() | && peut aussi, suivant le contexte, être utilisé dans une liste and pour concaténer des commandes. |
ou (logique)
if [ $condition1 ] || [ $condition2 ] # Identique à: if [ $condition1 -o $condition2 ] # Renvoie vrai si soit condition1 soit condition2 est vraie... if [[ $condition1 || $condition2 ]] # Fonctionne aussi. # Notez que l'opérateur || n'est pas autorisé dans des constructions [ ... ]. |
![]() | Bash teste l'état de sortie de chaque instruction liée avec un opérateur logique. |
Exemple 8-3. Tests de condition composés en utilisant && et ||
#!/bin/bash a=24 b=47 if [ "$a" -eq 24 ] && [ "$b" -eq 47 ] then echo "Le test #1 a réussi." else echo "Le test #1 a échoué." fi # ERREUR: si [ "$a" -eq 24 && "$b" -eq 47 ] # essaie d'exécuter ' [ "$a" -eq 24 ' # et échoue à trouver le ']' correspondant. # # si [[ $a -eq 24 && $b -eq 24 ]] fonctionne # (Le "&&" a une signification différente en ligne 17 qu'en ligne 6.) # Merci, Stephane Chazelas. if [ "$a" -eq 98 ] || [ "$b" -eq 47 ] then echo "Le test #2 a réussi." else echo "Le test #2 a échoué." fi # Les options -a et -o apportent une alternative au test de la condition composée. # Merci à Patrick Callahan pour avoir remarqué ceci. if [ "$a" -eq 24 -a "$b" -eq 47 ] then echo "Le test #3 a réussi." else echo "Le test #3 a échoué." fi if [ "$a" -eq 98 -o "$b" -eq 47 ] then echo "Le test #4 a réussi." else echo "Le test #4 a échoué." fi a=rhino b=crocodile if [ "$a" = rhino ] && [ "$b" = crocodile ] then echo "Le test #5 a réussi." else echo "Le test #5 a échoué." fi exit 0 |
Les opérateurs && et || trouvent aussi leur utilité dans un contexte arithmétique.
bash$ echo $(( 1 && 2 )) $((3 && 0)) $((4 || 0)) $((0 || 0)) 1 0 1 0 |
opérateur virgule
L'opérateur virgule chaîne ensemble deux ou plusieurs opérations arithmétiques. Toutes les opérations sont évaluées (avec des possibles effets indésirables), mais seule la dernière opération est renvoyée.
let "t1 = ((5 + 3, 7 - 1, 15 - 4))" echo "t1 = $t1" # t1 = 11 let "t2 = ((a = 9, 15 / 3))" # Initialise "a" et calcule "t2". echo "t2 = $t2 a = $a" # t2 = 5 a = 9 |
L'opérateur virgule trouve son utilité principalement dans les boucles for. Voir Exemple 10-12.
Précédent | Sommaire | Suivant |
Opérations et thèmes relatifs | Niveau supérieur | Constantes numériques |