logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

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

Ceci est une ancienne révision du document !


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 !

Introduction

Bash dispose de plusieurs commandes pour réaliser des comparaisons numériques:

  • La commande composée d'évaluation numérique ((,
  • La commande [ (ou test),
  • Et la commande composée [[.

Comparaison numérique avec ((

Syntaxe :

(( expr opérateur expr ))
Opérateurs de comparaison numérique de la commande ((
Opérateurs Description
== 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

Exemple dans le terminal

nombre1=12
nombre2=13
(( $nombre1 > $nombre2 ))
echo $?
 
unset nombre1 nombre2
retour de la commande
1

Les paramètres peuvent être transmis sans $ (Sauf les paramètres positionnels et les paramètres spéciaux)
Les espaces peuvent être omis.

n1=42
n2=24
(( n1 > n2 )) && echo "$n1 > $n2" || echo "$n1 < $n2"
 
if ((n1>n2))
then
	echo "$n1 est supérieur à $n2"
else
	echo "$n1 est inférieur à $n2"
fi
 
unset n1 n2
retour de la commande
42 > 24
42 est supérieur à 24

Exemple dans un 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
bash mon_script
echo $?
retour de la commande
8 n'est pas inférieur à 2
0

Remarque : L’exécution du script retournera toujours 0 (true), car le code de retour renvoyé est celui de la dernière commande exécutée, qui est echo (voir utilisation de la commande exit).

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 ASCII2).
De même, attention 26 n'est pas plus grand que 25 !
Mais 26 est après 25.

Comparaison numérique avec [ et [[

La comparaison numérique peut aussi se réalisée avec les commandes [ (ou test) et [[.

Syntaxe :

[ expr opérateur expr ]
[[ expr opérateur expr ]]
Opérateurs de comparaison des commande [ et [[
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 à

Exemples 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
[ 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 !
doc/programmation/shells/page-man-bash-iii-les-operateurs-de-comparaison-numerique.1676363610.txt.gz · Dernière modification: 14/02/2023 09:33 par agp91

Pied de page des forums

Propulsé par FluxBB