Syntaxe :
expr $nbr1 opérateur $nbr2
expr $chaine : expression régulière
Opérateurs :
Attention, certains opérateurs ayant une signification particulière pour le shell, ceux ci doivent être protégés par un antislash.
Opérateurs | Signification |
---|---|
Opérateurs arithmétiques | |
$nb1 + $nb2 | Addition |
$nb1 - $nb2 | Soustraction |
$nb1 \* $nb2 | Multiplication |
$nb1 / $nb2 | Division |
$nb1 % $nb2 | Modulo |
Opérateurs de comparaison | |
$nb1 \> $nb2 | VRAI si $nb1 est strictement supérieur à $nb2 |
$nb1 \>= $nb2 | VRAI si $nb1 est supérieur ou égal à $nb2 |
$nb1 \< $nb2 | VRAI si $nb1 est strictement inférieur à $nb2 |
$nb1 \<= $nb2 | VRAI si $nb1 est inférieur ou égal à $nb2 |
$nb1 = $nb2 | VRAI si $nb1 est égal à $nb2 |
$nb1 != $nb2 | VRAI si $nb1 est diférent de $nb2 |
Opérateurs logiques | |
$chaine1 \& $chaine2 | VRAI si les 2 chaines sont vraies |
$chaine1 \| $chaine2 | VRAI si l'une des 2 chaines est vraie |
Opérateurs divers | |
-$nb1 | Opposé de $nb1 |
\( expression \) | Regroupement |
$chaine : expression_reguliere | Compare la chaine avec l'expression régulière |
Les arguments de la commande expr doivent toujours être séparés par au moins un espace ou une tabulation.
Exemple :
$ nb=3
$ expr $nb + 5
8
$ expr $nb \* 6
18
$ expr $nb / 2
1
$ nb=10
$ expr $nb % 3
1
$ expr $nb - -5
15
$
Récupérer le résultat dans une variable :
$ nb2=`expr $nb - 2`
$ echo $nb2
8
$
Priorité d'exécution des opérateurs :
$ nb=5
$ nb2=`expr $nb \* 3 + 4`
$ echo $nb2
19
$ nb2=`expr $nb \* \( 3 + 4 \)`
$ echo $nb2
35
$
Résultat d'une comparaison VS valeur du code de retour :
$ nb=2
$ expr $nb \>= 1
1 # Résultat de la comparaison
$ echo $?
0 # Résultat du code de retour
$ expr $nb \>= 3
0 # Résultat de la comparaison
$ echo $?
1 # Résultat du code de retour
$
Différents types de comparaison :
$ nl comparaison.sh
1 #!/bin/bash
2 # Test sur le nombre d'arguments
3 if [[ $# -ne 2 ]]
4 then
5 echo "Mauvais nombre d'arguments"
6 echo "Utilisation : $0 expr1 expr2"
7 exit 1
8 fi
9 # On compare expr1 et expr2 avec la commande EXPR et redirection du résultat dans /dev/null
10 if expr $1 \> $2 > /dev/null
11 then
12 echo "Comparaison EXPR : $1 est supérieur à $2"
13 else
14 echo "Comparaison EXPR : $1 est inférieur à $2"
15 fi
16 # On compare expr1 et expr2 avec la commande [[ ]] (lexicographiquement)
17 if [[ $1 > $2 ]]
18 then
19 echo "Comparaison lexico.. [[ ]] : $1 est supérieur à $2"
20 else
21 echo "Comparaison lexico.. [[ ]] : $1 est inférieur à $2"
22 fi
23 # On compare expr1 et expr2 avec la commande [[ ]]
24 if [[ $1 -gt $2 ]]
25 then
26 echo "Comparaison [[ ]] : $1 est supérieur à $2"
27 else
28 echo "Comparaison [[ ]] : $1 est inférieur à $2"
29 fi
30 exit 0
$ ./comparaison.sh 9 5
Comparaison EXPR : 9 est supérieur à 5
Comparaison lexico.. [[ ]] : 9 est supérieur à 5
Comparaison [[ ]] : 9 est supérieur à 5
$ ./comparaison.sh 50 9
Comparaison EXPR : 50 est supérieur à 9
Comparaison lexico.. [[ ]] : 50 est inférieur à 9
Comparaison [[ ]] : 50 est supérieur à 9
$ ./comparaison.sh a b
Comparaison EXPR : a est inférieur à b
Comparaison lexico.. [[ ]] : a est inférieur à b
Comparaison [[ ]] : a est inférieur à b
$ ./comparaison.sh t r
Comparaison EXPR : t est supérieur à r
Comparaison lexico.. [[ ]] : t est supérieur à r
Comparaison [[ ]] : t est inférieur à r
$
Le résultat de la commande EXPR est toujours exact que ce soit des chiffres ou des caractères.
Syntaxe :
((expression_arithmétique))
Utilisation :
La commande (( )) dispose de nombreux avantages par rapport à la commande expr
Une grande partie des opérateurs proviennent du langage C
Opérateurs | Signification |
---|---|
Opérateurs arithmétiques | |
nbr1 + nbr2 | Addition |
nbr1 - nbr2 | Soustraction |
nbr1 * nbr2 | Multiplication |
nbr1 / nbr2 | Division |
nbr1 % nbr2 | Modulo |
Opérateurs travaillant sur les bits | |
~nbr1 | Complément à 1 |
nbr1 >> nbr2 | Décalage sur nbr1 de nbr2 bits à droite |
nbr1 << nbr2 | Décalage sur nbr1 de nbr2 bits à gauche |
nbr1 & nbr2 | ET bit à bit |
nbr1 | nbr2 | OU bit à bit |
nbr1 ^ nbr2 | OU exclusif bit à bit |
Opérateurs de comparaison | |
nbr1 > nbr2 | VRAI si nbr1 est strictement supérieur à nbr2 |
nbr1 >= nbr2 | VRAI si nbr1 est supérieur ou égal à nbr2 |
nbr1 < nbr2 | VRAI si nbr1 est strictement inférieur à nbr2 |
nbr1 <= nbr2 | VRAI si nbr1 est inférieur ou égal à nbr2 |
nbr1 == nbr2 | VRAI si nbr1 est égal à nbr2 |
nbr1 != nbr2 | VRAI si nbr1 est différent de nbr2 |
Opérateurs logiques | |
!nbr1 | Inverse la valeur de vérité de nbr1 |
&& | ET |
|| | OU |
Opérateurs divers | |
-nbr1 | Opposé de nbr1 |
nbr1 = expression | Assignement |
(expression) | Regroupement |
nbr1 binop= nbr2 | binop représente l'un des opérateurs suivants : +, -, /, *, %, >>, <<, &, |, ^. Equivalent à nbr1 = nbr1 binop nbr2 |
Exemples :
Ajouter 10 à nbr1 (2 méthodes différentes)
$ nbr1=10
$ ((nbr1=nbr1+10))
$ echo $nbr1
20
$ nbr1=10
$ ((nbr1+=10))
$ echo $nbr1
20
$
Test si nbr1 est supérieur à nbr2 et inversement
$ nbr1=5
$ nbr2=6
$ ((nbr1>nbr2))
$ echo $?
1 # Code retour 1 (faux) car nbr1 n'est pas supérieur à nbr2
$ ((nbr1<nbr2))
$ echo $?
0 # Code retour 0 (vrai) car nbr1 est inférieur à nbr2
$
Le script suivant compare les 2 arguments passés en paramètre
$ nl comparaison2.sh
1 #!/bin/bash
2 # Test sur le nombre d'arguments
3 if (($#!=2))
4 then
5 echo "Mauvais nombre d'arguments"
6 echo "Utilisation : $0 nbr1 nbr2"
7 exit 1
8 fi
9 # On compare nbr1 et nbr2 avec la commande (( ))
10 if (($1<$2))
11 then
12 echo "$1 est inférieur à $2"
13 else
14 if (($1>$2))
15 then
16 echo "$1 est supérieur à $2"
17 else
18 if (($1==$2))
19 then
20 echo "$1 est égal à $2"
21 else
22 echo "Comparaison impossible"
23 fi
24 fi
25 fi
26 exit 0
$ ./comparaison2.sh 2 8
2 est inférieur à 8
$ ./comparaison2.sh 8 2
8 est supérieur à 2
$ ./comparaison2.sh 8 8
8 est égal à 8
$
Regroupements et tests logiques
$ nbr1=2
$ nbr2=5
$ if (( (nbr1>0) && (nbr2>nbr1) ))
> then
> echo "nbr1 est supérieur à 0 et inférieur à nbr2"
> else
> echo "nbr1 est égal à 0 ou supérieur à nbr2"
> fi
nbr1 est supérieur à 0 et inférieur à nbr2
$
La commande let est équivalente à ((expression))
Syntaxe :
let "expression"
Exemple :
Multiplier nbr1 par 3
$ nbr1=5
$ let "nbr1=nbr1*3"
$ echo $nbr1
15
$
Calculer le modulo de nbr1 par 2 et l'affecter à la variable nbr2
$ nbr1=5
$ let "nbr2=nbr1%2"
$ echo $nbr1
5
$ echo $nbr2
1
$