Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Bash : les opérateurs de comparaison numérique

Nota : Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !

Opérateurs booléens de comparaison de nombres

Comme aux chapitres précédents on retrouve les opérateurs de comparaisons booléens de comparaison (== , != , < , > , >=, , ! )
et des caractères de comparaisons relatifs aux commandes de tests.

Opérateur Description
= initialisation d'une constante numérique2)
== Comparaison d'un égalité
!= Comparaison d'une différence
> Comparaison de plus grand que
>= Comparaison de plus grand ou égal que
< Comparaison de plus petit que
Comparaison de plus petit ou égal que
  • Syntaxe :
(( a = 23 ))  # Initialiser une valeur, style C, avec des espaces des deux
              # côtés du signe "=".
 
(("$a" < "$b"))
 
(("$a" <= "$b"))
 
(("$a" > "$b"))

Attention on ne vérifie pas si deux nombres sont égaux avec les doubles parenthèses car cela n'est pas une comparaison !

  • Exemple dans le terminal :
(( nombre1 = 12 ))
#puis
(( nombre2 = 13 ))
#puis
(( "$nombre1" > "$nombre2" ))
#puis
echo $?
retour de la commande
1
  • Exemple avec le script “mon-script” :
mon-script
#!/bin/bash
a=8 ; b=2
if (( "$a" < "$b" )) ; then
  echo " $a < $b "
else
  echo "$a n'est pas inférieur à $b"
fi
./mon-script ; echo $?
retour de la commande
8 n'est pas inférieur à 2
0

Pour le code de retour 0 : voir utilisation de la commande exit dans les scripts

Attention à la confusion avec les tests sur les chaînes de caractères !

script
#!/bin/bash
a=23
b=4
if (( "$a" < "$b" )) ; then
	echo "$a > $b"
else
	echo "aïe : $a < $b ???" 
fi
echo " "
 
c="23"
d="24"
if test "$c" > "$d" ; then
  echo "Attention ! incohérence "$c" > "$d" car avec test et crochets, 
        il s'agit de tests sur les chaînes de caractères."
fi
echo " "
 
e="26"
f="25"
if [ "$e" > "$f" ] ; then 
  echo "De même, Attention ! "$e" n'est pas plus grand que "$f" 
	mais après "$f" selon l'ordre des caractères ASCII !!!"
fi

Retour: 8-O

Remarquez l'incohérence : 23 > 24
Il s'agit de tests sur les chaînes de caractères, donc il ne s'agit pas de plus petit
ou de plus grand, mais d'avant et après, selon l'ordre des caractères ASCII3).
De même, attention 26 n'est pas plus grand que 25 !
Mais 26 est après 25.

Opérateurs de comparaison de nombres avec la commande test ou les crochets

(pour comparer des nombres comme avec les booléens, mais avec la commande test ou crochets)

Caractères Significations
-eq est égal à
-ne n'est pas égal à
-gt est plus grand que
-ge est plus grand ou égal à
-lt est plus petit que
-le est plus petit ou égal à

Syntaxe avec les crochets :

[ "$a" -eq "$b" ]

Syntaxe avec la commande test :

test "$a" -eq "$b"

Exemple avec crochets dans le terminal :

[ 25 -eq 20 ]
echo $?
retour de la commande
1 
Ou encore :
var1=17
var2=18
[ "$var1" -gt "$var2" ]
echo $?
OU mieux :
test 100 -gt 99 && echo "vrai" || echo "faux"  # retour : vrai
test 100 -lt 99 && echo "vrai" || echo "faux"   # retour : faux
MAIS
[ "LEbash" = "Labash" ]; echo $? 
retour de la commande
1    
car l'expression est fausse
[ 5 -eq 5 ]; echo $?
retour de la commande
 0
car l'expression est vraie

Exemple avec la commande test dans le terminal:

test 17 -gt 11 ; echo $?
retour de la commande
 0

De même :

var1=17 ; var2=11 ; test "$var1" -gt "$var2" ; echo $?
retour de la commande
 0

Exemple avec les crochets dans un script:

mon-script
#!/bin/bash
a=2 ; b=1
if [ "$a" -gt "$b" ] ; then
        echo "$a est plus grand que $b"
fi
./mon-script :
retour de la commande
2 est plus grand que 1

Exemple avec la commande test dans un script:

mon-script
if test 100 -gt 99
then
	echo "vrai"   #réponse : vrai
else
	echo "faux"
fi
./mon-script
retour de la commande
vrai

Attention :

mon-script
#!/bin/bash
var1=8
var2=7
if test "$e" -gt "$f" ; then
  echo " $var1 est plus grand que $var2 "
fi
echo " "
if test 8 -gt 7 ; then 
  echo " $var1 est plus grand que $var2 "
fi
./mon-script
retour de la commande
 : ligne 18 : test:  : nombre entier attendu comme expression
 
 8 est plus grand que 7

Conclusion sur les opérateurs lexicographiques et les opérateurs de comparaison numérique

Yep, plus de confusions !

Nous avons vu :

  • qu'il y a deux mécanismes pour effectuer des tests, la paire de crochets et la commande test;
  • qu'à chaque mécanisme sa syntaxe :
$ test -f /etc/gaga

Ou

$ [ -f /etc/gaga ]

(Si le fichier /etc/gaga existait, le code de retour serait 0.
Voir la commande exit et son utilisation dans les scripts.)

  • que, pour des comparaisons sur les nombres on utilise :

soit les doubles parenthèses avec les opérateurs booléens :

 ==    !=   <	>   >=   <=

soit les crochets (ou la commande “test”) avec les opérateurs :

-eq   -ne   -gt   -ge   -lt   -le
  • qu'on utilise exclusivement les opérateurs -eq ; -ne ; -gt ; -ge ; -lt ; -le sur les nombres mais pas sur les chaînes de caractères ;
  • qu'enfin il ne faut pas confondre pas avec les opérateurs précédents, les options qu'on utilise exclusivement pour tester les fichiers :-e ; -d; -f ; -L ; -r ; -w ; -x ; $fichier1 -nt $fichier2 ; $fichier1 -ot $fichier2

Plein d'exemples dans ce wiki en anglais : http://wiki.bash-hackers.org/commands/classictest

:-D

Pour aller plus loin : les opérateurs logiques.

Ils s'utilisent avec les tests.

Opérateur Signification
! Négation
-a et
-o ou

Et dans un ordre précis :

  1. ! (négation)
  2. -a (et)
  3. -o (ou)

  • Il doit toujours y avoir un espace autour des opérateurs: !, -a, -o.
  • Ne pas confondre -a (opérateur logique) avec un opérateur de test sur les fichiers.
  • Ne pas confondre -o (opérateur logique) avec -ot (test pour savoir si un fichier1 est plus ancien qu'un fichier2.
  • Il est possible de modifier la priorité d'exécution des opérateurs en utilisant des parenthèses.
  • Les parenthèses doivent être protégées par des anti-slash afin de ne pas être interprétées par le shell comme étant un regroupement de commandes: \\\(…\)

Exemples :

  • Le fichier “toto” n'est pas un répertoire :
[ ! -d /etc/group ]
echo $?
retour de la commande
 0
Il est vrai (retour 0) que ce “n'est pas” ;-)
  • Le fichier mon-script existe et est exécutable :
[ -f mon-script -a -x mon-script ]
echo $?
retour de la commande
 0

Tuto précédent

La suite c'est ici :

1) N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !
2) ne pas confondre avec = de l'affectation de variable qui n'a pas d'espace autour de lui
doc/programmation/shells/page-man-bash-iii-les-operateurs-de-comparaison-numerique.txt · Dernière modification: 22/10/2015 13:41 par milou

Pied de page des forums

Propulsé par FluxBB