Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format
PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
Dans la page précédente (Les opérateurs de comparaison numérique), nous avons abordé la commande interne let et la commande composée ((...)).
Nous complémentons ici leurs usages, pour réaliser des opérations mathématiques.
Les commandes let et ((...)) sont les seules commandes internes que bash dispose pour réaliser des opérations mathématiques.
A travers elles, bash est limité à opérer que sur des entiers signés (positifs ou négatifs).
Le résultat de l'évaluation d'une expression sera toujours un entier décimal signé.
Pour réaliser des opérations avec des nombres à virgule ou plus complexes, nous devons nous tourner vers des commandes externes tel que bc (non installé par défaut) ou awk. Ou alors utiliser d'autres langages interprétés tel que perl, python, etc (awk, perl et python sont disponibles par défaut sur les systèmes Debian).
Avec let et ((...)), la plage numérique autorisée est : -9223372036854775808 < 0 > 9223372036854775807
Après l'évaluation des expressions qu'elles contiennent, let et ((...)) renvoient le code de retour :
La commande ((...)) peut-être préfixée du caractère de remplacement $ pour former la commande $((...)), afin d’être remplacée par l'évaluation de l’expression qu'elle contient.
Les expressions numériques évaluées par let et ((...)) peuvent contenir des nombres de différent système numérique.
L'évaluation des expression (le résultat) sera toujours retourné en entier décimal.
Si non, la syntaxe suivante peut-être utilisée :
Avec :
Les opérateurs arithmétiques permettent de réaliser des calculs numériques classiques.
Liste des opérateurs arithmétiques | ||
Opérateurs | Désignations | Résultats |
---|---|---|
Opérateurs unaires | ||
+ expr | Signe positif | Valeur de expr |
- expr | Signe négatif | Opposé de expr |
Opérateurs binaires | ||
expr1 + expr2 | Addition | expr2 ajouté à expr1 |
expr1 - expr2 | Soustraction | expr2 retiré de expr1 |
expr1 * expr2 | Multiplication | expr1 multiplié par expr2 |
expr1 / expr2 | Division | expr1 divisé par expr2 |
expr1 % expr2 | Modulo | Reste de la division de expr1 par expr2 |
expr1 ** expr2 | Puissance | expr1 multiplié par lui-même expr2 fois |
Exemples :
a=42 # Affecte 42 à la variable a echo $((-a)) # Retourne l'opposé de la valeur contenue dans la variable a. echo $((21+025)) # Retourne l’addition de l'octal 25 au décimal 21. echo 3/2=$((3/2)) # Retourne 3/2 echo 3/2 reste $((3%2)) # Retourne le reste de 3/2 echo a=$a a^2=$((a**2)) # Retourne la valeur de la variable élevée à la puissance 2 unset a
-42 42 3/2=1 3/2 reste 1 a=42 a^2=1764
Les opérateurs d'affectation, permettent affecter une valeur à une variable ou d'en modifier la valeur.
Liste des opérateurs d'affectation | ||
Opérateurs | Désignations | Résultats |
---|---|---|
Opérateurs unaires | ||
++ var | Ré-affectation par la pré-incrémentation à 1 | var = var + 1 puis retourne var |
var ++ | Ré-affectation par la post-incrémentation à 1 | Retourne var, puis var = var + 1 |
– var | Ré-affectation par la pré-décrémentation à 1 | var = var - 1 puis retourne var |
var – | Ré-affectation par la post-décrémentation à 1 | Retourne var, puis var = var - 1 |
Opérateurs binaires | ||
var = expr | Simple affectation | Affecte epxr à la variable var |
var += expr | Ré-affectation par l'incrémentation | var = var + expr |
var -= expr | Ré-affectation par la décrémentation | var = var - expr |
var *= expr | Ré-affectation par la multiplication | var = var * expr |
var /= expr | Ré-affectation par la division | var = var / expr |
var %= expr | Ré-affectation par modulo | var = var % expr |
Exemples :
declare -p a let a=24 ; declare -p a ((a=42)) ; echo a=$a let 'a += 42' ; echo "a+=42 -> a=$a" (( a /= 2 )) ; echo "a/=2 -> a=$a" unset a
bash: declare: a : non trouvé declare -- a="24" a=42 a+=42 -> a=84 a/=2 -> a=42
declare -i b=42 declare -p b echo "Pré-incrémentation à 1 : Avant b=$b ; Pendant b=$((++b)) ; Après : b=$b" echo "Post-décrémentation à 1 : Avant b=$b ; Pendant b=$((b--)) ; Après : b=$b" unset b
declare -i b="42" Pré-incrémentation à 1 : Avant b=42 ; Pendant b=43 ; Après : b=43 Post-décrémentation à 1 : Avant b=43 ; Pendant b=43 ; Après : b=42
Voir aussi :
Les opérateurs relationnels permettent la comparaison entre deux epressions numériques.
Voir Comparaison numérique avec ((...))
Les opérateurs bit-bit, opèrent sur des nombres binaires (une suite de 0 ou de 1). Les nombres sont d'abords convertis en binaire, l’opération est appliquée, puis le résultat est reconverti en décimal.
Liste des opérateurs bit-à-bit | ||
Opérateurs | Désignations | Résultats |
---|---|---|
Opérateur unaire | ||
~ expr | Négation binaire | Retourne le complément à 1 de expr (~1 → 0 ; ~0 → 1) |
Opérateurs binaires | ||
expr1 & expr2 | ET binaire | Retourne le ET bit-à-bit entre expr1 et expr2 (1 ET 1 → 1 ; 0 ET 0 → 0 ; 1 ET 0 → 0 ; 0 ET 1 → 0) |
expr1 | expr2 | OU binaire | Retourne le OU bit-à-bit entre expr1 et expr2 (1 OU 1 → 1 ; 0 OU 0 → 0 ; 1 OU 0 → 1 ; 0 OU 1 → 1) |
expr1 ^ expr2 | OU binaire exclusif (XOR) | Retourne le OU bit-à-bit exclusif entre expr1 et expr2 (1 XOR 1 → 0 ; 0 XOR 0 → 0 ; 1 XOR 0 → 1 ; 0 XOR 1 → 1) |
expr1 << expr2 | Décalage binaire à gauche | Retourne le décalage de expr2 bit(s) à gauche de expr1 (expr2 0 ajoutés(s) à droite d'expr1) |
expr1 >> expr2 | Décalage binaire à droite | Retourne le décalage de expr2 bit(s) à droite de expr1 (expr2 bit(s) tronqué(s) à droite d'expr1) |
Exemples
echo $((~42)) echo $((42^42)) echo $((42<<2))
-43 0 168
Voir aussi :
#!/bin/bash declare -i x=20 y # ici les signes = permettent une affection (( y = x++ )) # d'abord la valeur de x est conservée dans la valeur de y (donc $y= 20) puis la valeur # de x est incrémentée ($x est donc égal à 21) # les espaces autour du signe = ne sont pas obligatoires echo "y=$y x=$x" # réponse : y=20 x=21
#!/bin/bash declare -i x=20 y (( y = ++x )) # d'abord la valeur de x est incrémentée puis la valeur de y reçoit # la valeur du x incrémenté # les espaces autour du signe = ne sont pas obligatoires echo "y=$y x=$x" # réponse : y=21 x=21
#!/bin/bash declare -i x=20 y (( y = x-- )) # d'abord la valeur de x est conservée dans la valeur de y (donc $y= 20) # puis la valeur de x est décrémentée ($x est donc égal à 19) # les espaces autour du signe = ne sont pas obligatoires echo "y=$y x=$x" # réponse : y=20 x=19
#!/bin/bash declare -i x=20 y (( y = --x )) # d'abord la valeur de x est décrémentée ($x=19), puis la valeur de y # reçoit la valeur du x incrémenté (donc $y=19) # les espaces autour du signe = ne sont pas obligatoires echo "y=$y x=$x" # réponse : y=19 x=19
++
) ou de décrémentation (--
) sont placés après une valeur à incrémentée (+1) ou à décrémenter (-1) ; cette valeur est conservée dans “y” puis elle est incrémentée (+1) ou décrémentée (-1).
Pré-incrémentation/décrémentation : Les signes d'incrémentation (++
) ou de décrémentation (--
) sont placés avant une valeur à incrémentée ou à décrémenter ; cette valeur est incrémentée (+1) ou décrémentée (-1) puis elle est conservée dans “y”.