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 permis après le "=".
Ne confondez pas l'« opérateur d'affectation = » avec l'opérateur de test =.
# = comme opérateur de test if [ "$chaine1" = "$chaine2" ] then commande fi # if [ "X$chaine1" = "X$chaine2" ] est plus sûr, # pour empêcher un message d'erreur si une des variables devait être vide # (les caractères "X" postfixés se neutralisent).
plus
moins
multiplication
division
exponentielle
# Bash, version 2.02, introduit l'opérateur exponentiel "**". let "z=5**3" # 5 * 5 * 5 echo "z = $z" # z = 125
modulo, ou mod (renvoie le reste de la division d'un entier)
bash$ expr 5 % 3 2
5/3 = 1, et il reste 2
Cet opérateur trouve son utilité, entre autres choses, dans la génération de nombres compris dans un intervalle donné (voir l'Exemple 9.26, « Générer des nombres aléatoires » et l'Exemple 9.30, « Lancement d'un seul dé avec RANDOM ») et pour le formatage de la sortie d'un programme (voir l'Exemple 26.15, « Application complexe des tableaux Exploration d'une étrange série mathématique » et l'Exemple A.6, « Séries de Collatz »). Il peut même être utilisé pour générer des nombres premiers (voir Exemple A.15, « Générer des nombres premiers en utilisant l'opérateur modulo »). De manière assez surprenante, l'opérateur Modulo est employé fréquemment comme astuce de calcul numérique.
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 par une constante)
Les opérateurs arithmétiques sont trouvés souvent dans une expression expr ou let.
Les variables de type entier dans les anciennes versions de Bash sont réellement de étaient des entiers longs signés (32-bit) allant de -2147483648 à 2147483647. Une opération prenant une variable en dehors de ces limites donnait un résultat erroné.
echo $BASH_VERSION # 1.14 a=2147483646 echo "a = $a" # a = 2147483646 let "a+=1" # Incrémente "a". echo "a = $a" # a = 2147483647 let "a+=1" # Incrémente encore "a", en dehors de la limite. echo "a = $a" # a = -2147483648 # ERREUR (hors limites) # + et le bit le plus à gauche, le bit de signe, # + a été positionné, d'oû un resultat négatif. # +
À partir de la version 2.05b, Bash implémente les entiers à 64 bits.
Bash ne comprend pas l'arithmétique à virgule flottante. Il traite les nombres contenant un point décimal comme des chaînes de caractères.
a=1.5 let "b = $a + 1.3" # Erreur. # t2.sh: let: b = 1.5 + 1.3: erreur de syntaxe dans l'expression # (error token is ".5 + 1.3") echo "b = $b" # b=1
Utiliser bc dans des scripts qui ont besoin de calculs à virgule flottante ou de fonctions de la bibliothèque math.
opérateurs de bits. Les opérateurs de bits font rarement une apparition dans les scripts shell. Leur utilisation principale semble ê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 fournissent un accès direct au matériel.
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 binaire-égal
OU binaire
OU binaire-égal
NON binaire
XOR binaire
XOR binaire-égal
opérateurs (booléens) logiques
NOT
if [ ! -f $NOMFICHIER ] then ...
ET
if [ $condition1 ] && [ $condition2 ] # Identique à : if [ $condition1 -a $condition2 ] # Renvoie vrai si condition1 et condition2 sont vraies... if [[ $condition1 && $condition2 ]] # Fonctionne aussi. # Notez que l'opérateur && n'est pas autorisé dans l'expression #+ <emphasis>entre crochets</emphasis> de la syntaxe [ ... ].
Suivant le contexte, && peut aussi être utilisé dans une liste ET, pour concaténer des commandes.
OU
if [ $condition1 ] || [ $condition2 ] # Identique à: if [ $condition1 -o $condition2 ] # Renvoie vrai si condition1 ou condition2 est vraie... if [[ $condition1 || $condition2 ]] # Fonctionne aussi. # Notez que l'opérateur || n'est pas autorisé dans l'expression #+ <emphasis>entre crochets</emphasis> de la syntaxe [ ... ].
Bash teste l'état de sortie de chaque instruction liée avec un opérateur logique.
Exemple 8.3. Tests de conditions composées 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: if [ "$a" -eq 24 && "$b" -eq 47 ] # essaie d'exécuter ' [ "$a" -eq 24 ' # et échoue à trouver le ']' correspondant. # # Note : if [[ $a -eq 24 && $b -eq 24 ]] fonctionne # Le test if avec double crochets est plus flexible que la version avec # simple crochet. # (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 de bord. [33]
let "t1 = ((5 + 3, 7 - 1, 15 - 4))" echo "t1 = $t1" ^^^^^^ # t1 = 11 # Ici t1 a pour valeur le résultat de la dernière opération. Pourquoi ? 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 l'Exemple 10.12, « Une boucle for comme en C ».