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 →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [20/02/2023 21:31] agp91 [Conclusion sur les opérateurs lexicographiques et les opérateurs de comparaison numérique] |
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [30/09/2023 23:06] (Version actuelle) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
======Bash : les opérateurs de comparaison numérique====== | ======Bash : les opérateurs de comparaison numérique====== | ||
- | * Objet : suite de la série de wiki visant à maîtriser bash via les différents caractère spéciaux. | + | * Objet : Suite de la série de wiki visant à maîtriser bash par les caractère. |
- | * Niveau requis : {{tag>débutant avisé}} | + | * Niveau requis : {{tag>débutant}} |
- | * Commentaires : FIXME | + | * Commentaires : Bash, ligne de commande et scripts |
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
- | * Suivi : | + | * Suivi : {{tag>à-tester}} |
* Création par [[user>Hypathie]] le 08/04/2014 | * Création par [[user>Hypathie]] le 08/04/2014 | ||
* Testé par [[user>Hypathie]] en Avril 2014 | * Testé par [[user>Hypathie]] en Avril 2014 | ||
+ | * Modifié par [[user>agp91]] le 21/02/2022 | ||
* Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=140771#p140771 | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=140771#p140771 | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | ||
**Nota :** Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | **Nota :** Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
- | |||
* [[doc:programmation:shells:bash-les-differents-caracteres-speciaux|Vision d'ensemble]] | * [[doc:programmation:shells:bash-les-differents-caracteres-speciaux|Vision d'ensemble]] | ||
* [[doc:programmation:shells:la-page-man-bash-les-caracteres-speciaux|Détail et caractères]] | * [[doc:programmation:shells:la-page-man-bash-les-caracteres-speciaux|Détail et caractères]] | ||
- | * [[doc:programmation:shells:la-page-man-bash-ii-les-operateurs-lexicographiques|Les opérateurs lexicographiques]] | + | * [[atelier:chantier:bash:les-operateurs-sur-parametres|Les opérateurs de test sur paramètres]] |
- | * ;-) | + | * [[doc:programmation:shells:la-page-man-bash-ii-les-operateurs-lexicographiques|Les opérateurs de test sur chaînes]] |
- | * [[doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques|Les symboles dans les calculs]] | + | * [[atelier:chantier:bash:les-operateurs-de-test-sur-fichiers|Les opérateurs de test sur fichiers]] |
- | * [[doc:programmation:shells:page-man-bash-v-les-tableaux|Les tableaux]] | + | * **Les opérateurs de comparaison numérique** ;-) |
+ | * [[doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques|Les symboles dans les calculs]] | ||
+ | * [[doc:programmation:shells:page-man-bash-v-les-tableaux|Bash : les tableaux]] | ||
* [[doc:programmation:shells:man-bash-vi-les-caracteres-de-transformation-de-parametres|Les caractères de transformation de parametres]] | * [[doc:programmation:shells:man-bash-vi-les-caracteres-de-transformation-de-parametres|Les caractères de transformation de parametres]] | ||
* [[doc:programmation:shells:bash-vii-globs-etendus-regex|Bash : Variables, globs étendus, ERb, ERe]] | * [[doc:programmation:shells:bash-vii-globs-etendus-regex|Bash : Variables, globs étendus, ERb, ERe]] | ||
- | |||
===== Introduction ===== | ===== Introduction ===== | ||
<note> | <note> | ||
- | Dans la page du manuel de bash, **les opérateurs des commandes de test** sont nommées __**primitives**__. | + | Dans la page du manuel de bash, **les opérateurs des commandes de test** sont nommés __**primitives**__. |
</note> | </note> | ||
Ligne 47: | Ligne 48: | ||
__Rappels :__ | __Rappels :__ | ||
- | * Une commande de test renvoie le code de retour 0 (considérer comme vrai) lorsque le test réussi et 1 (considérer comme faux) lorsqu'il échoue. | + | * Une commande de test renvoie le code de retour **0** (considéré comme vrai) lorsque le test réussi et **1** (considéré comme faux) lorsqu'il échoue. |
- | * Le code retour d'une commande est mémorisé dans le paramètre spécial $?. | + | * Le code retour d'une commande est mémorisé dans le paramètre spécial **$?**. |
- | * L'opérateur de contrôle **&&** exécute la commande suivante, si la commande précédente à renvoyée un code de retour égale à 0. | + | * L'opérateur de contrôle **&&** exécute la commande suivante, si la commande précédente a renvoyé un code de retour égal à **0**. |
- | * L'opérateur de contrôle **||** exécute la commande suivante, si la commande précédente à renvoyée un code de retour supérieur à 0. | + | * L'opérateur de contrôle **||** exécute la commande suivante, si la commande précédente a renvoyé un code de retour supérieur à **0**. |
</note> | </note> | ||
Ligne 126: | Ligne 127: | ||
</file> | </file> | ||
- | ==== Particularités de la commande [[ ==== | + | ==== Particularités de la commande <nowiki>[[</nowiki> ==== |
Seule la commande **<nowiki>[[</nowiki>** permet de tester une expression arithmétique. | Seule la commande **<nowiki>[[</nowiki>** permet de tester une expression arithmétique. | ||
Ligne 324: | Ligne 325: | ||
===== Comparaison numérique avec (( ===== | ===== Comparaison numérique avec (( ===== | ||
- | Syntaxe : | + | La commandes d'évaluation numérique **<nowiki>((</nowiki>** (commande composée) et la commande **let** (commande interne), permettent de réaliser des comparaisons numériques.\\ |
- | <code> | + | Elles disposent de 6 opérateurs de comparaison. |
- | let <expr1><OP><expr2> | + | |
- | let "<expr1> <OP> <expr2>" | + | |
- | (( <expr1> <OP> <expr2> )) | + | |
- | <expr1> et <expr2> sont sujets au développement des paramètres et à l’évaluation arithmétique. | + | ==== Syntaxe ==== |
- | Avec <OP> l'un des opérateurs donnés dans le tableau suivant. | + | |
- | </code> | + | |
- | __Remarques :__ Les commandes **let** et **<nowiki>((</nowiki>** sont équivalentes. | + | * **let expr1<OP>expr2** |
+ | * **let "expr1 <OP> expr2"** | ||
+ | * **<nowiki>((</nowiki> <expr1> <OP> <expr2> <nowiki>))</nowiki>** | ||
- | | Opérateurs de comparaison numérique des commandes let et <nowiki>((</nowiki> || | + | * Avec : |
- | ^ Opérateurs ^ Description ^ | + | * **Expr1** et **expr2** sont sujets au développement des paramètres et à l’évaluation arithmétique. |
- | | '' == '' | Comparaison d'une égalité | | + | * **<OP>** l'un des opérateurs donnés dans le tableau suivant. |
- | | '' != '' | Comparaison d'une différence | | + | |
- | | '' > '' | Comparaison de plus grand que | | + | |
- | | '' >= '' | Comparaison de plus grand ou égal que | | + | |
- | | '' < '' | Comparaison de plus petit que | | + | |
- | | ''<nowiki><=</nowiki> '' | Comparaison de plus petit ou égal que | | + | |
+ | | Opérateurs de comparaison numérique des commandes let et <nowiki>((</nowiki> || | ||
+ | ^ Opérateurs ^ Retours ^ | ||
+ | | '' == '' | Vrai si égale | | ||
+ | | '' != '' | Vrai si différent | | ||
+ | | '' > '' | Vrai si plus grand que | | ||
+ | | '' >= '' | Vrai si plus grand ou égal que | | ||
+ | | '' < '' | Vrai si plus petit que | | ||
+ | | ''<nowiki><=</nowiki> '' | Vrai plus petit ou égal que | | ||
+ | <note> | ||
La commande **let** ne supporte qu'un seul argument.\\ | La commande **let** ne supporte qu'un seul argument.\\ | ||
Si l'expression arithmétique à évaluer comporte des espaces, l'expression doit être protégée par des guillemets simples ou doubles.\\ | Si l'expression arithmétique à évaluer comporte des espaces, l'expression doit être protégée par des guillemets simples ou doubles.\\ | ||
Si l'expression n'est pas protégée, les opérateurs commençant par **<** ou **>** doivent être protégés\\ | Si l'expression n'est pas protégée, les opérateurs commençant par **<** ou **>** doivent être protégés\\ | ||
(Voir plus bas : [[https://debian-facile.org/doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique#mauvais-usages|Mauvais usages]].) | (Voir plus bas : [[https://debian-facile.org/doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique#mauvais-usages|Mauvais usages]].) | ||
+ | </note> | ||
- | ==== Exemples dans le terminal ==== | + | ==== Exemples ==== |
<code user> | <code user> | ||
Ligne 358: | Ligne 361: | ||
let 24\>=24 # Est-ce que 24 est supérieur ou égale à 24 | let 24\>=24 # Est-ce que 24 est supérieur ou égale à 24 | ||
echo $? # Affiche le code de retour. | echo $? # Affiche le code de retour. | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
0 | 0 | ||
0 | 0 | ||
Ligne 373: | Ligne 375: | ||
unset nombre1 nombre2 # Suppression des paramètres nombre1 et nombre2 | unset nombre1 nombre2 # Suppression des paramètres nombre1 et nombre2 | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
1 | 1 | ||
0 | 0 | ||
Ligne 388: | Ligne 389: | ||
unset n1 n2 | unset n1 n2 | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
42 > 24 | 42 > 24 | ||
42 est différent de 24 | 42 est différent de 24 | ||
Ligne 411: | Ligne 411: | ||
unset n | unset n | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
(("mot" == 0)) revoie le code de retour 0 | (("mot" == 0)) revoie le code de retour 0 | ||
let "mot <= 0" revoie le code de retour 0 | let "mot <= 0" revoie le code de retour 0 | ||
Ligne 426: | Ligne 425: | ||
unset n | unset n | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
0 | 0 | ||
1 | 1 | ||
Ligne 443: | Ligne 441: | ||
unset n1 n2 | unset n1 n2 | ||
- | </code> | + | </code><file> |
- | <file config retour de la commande> | + | |
4242 est supérieur à 2424 | 4242 est supérieur à 2424 | ||
</file> | </file> | ||
+ | |||
+ | Copions le code ci-dessous dans un fichier nommé **mon_script**.\\ | ||
+ | Puis exécutons avant de le supprimer. | ||
+ | |||
+ | <code bash 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 | ||
+ | </code><code user> | ||
+ | bash mon_script | ||
+ | echo $? | ||
+ | |||
+ | rm -v mon_script | ||
+ | </code><file> | ||
+ | 8 n'est pas inférieur à 2 | ||
+ | 0 | ||
+ | 'mon_script' supprimé | ||
+ | </file> | ||
+ | |||
+ | L’exécution du script renverra toujours **0** (vrai), car le code de retour renvoyé est celui de la dernière commande exécutée, qui est **echo**.\\ | ||
+ | (voir : [[doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests#utiliser-la-commande-exit|Utilisation de la commande exit]]). | ||
+ | |||
+ | Maintenant, nous allons créer une fonction (**test_si_négatif**) qui teste si une expression numérique ou arithmétique est négative. | ||
+ | |||
+ | <note> | ||
+ | La commande **return** est identique à la commande **exit** (**return** s'utilise dans une fonction, **exit** dans un script). | ||
+ | </note> | ||
+ | |||
+ | <code user> | ||
+ | test_si_négatif() { | ||
+ | # Test_si_négatif <expression> | ||
+ | # Retourne le code de retour 0 si <experssion> est négative | ||
+ | # Retourne le code de retour 1 si <experssion> est positive | ||
+ | # Retourne le code de reour 2 si la fonction est mal utilisée | ||
+ | local rc=2 # Initialise le paramètre rc avec la valeur 2 | ||
+ | if (( $# == 0 )) # Test si le nombre d'argument est 0 | ||
+ | then # Si oui, | ||
+ | echo "Argument manquant" >&2 # Retourne un message sur le canal d'erreur | ||
+ | elif (( $# > 1 )) # Si non, test si le nombre d'argument est > à 1 | ||
+ | then # Si oui | ||
+ | echo "Trop d'arguments" >&2 # Retourne un message sur le canal d'erreur. | ||
+ | elif (($1 >= 0)) # Si non, test si l'argument est positif ou égale à 0 | ||
+ | then # Si oui, | ||
+ | rc=1 # Affecte 1 au paramètre rc | ||
+ | elif (($1 < 0)) # Si non, test si l'argument est négatif | ||
+ | then # Si oui, | ||
+ | rc=0 # Affecte 0 au paramètre rc | ||
+ | fi | ||
+ | return $rc # Affecte $rc au code retour | ||
+ | } | ||
+ | |||
+ | test_si_négatif ; echo -e $?\\n | ||
+ | test_si_négatif 42 ; echo $? | ||
+ | test_si_négatif -42 ; echo $? | ||
+ | test_si_négatif 42-84 ; echo $? | ||
+ | |||
+ | unset test_si_négatif | ||
+ | </code><code> | ||
+ | Argument manquant | ||
+ | 2 | ||
+ | |||
+ | 1 | ||
+ | 0 | ||
+ | 0 | ||
+ | </code> | ||
+ | |||
+ | Le 4eme usage de notre fonction montre que la commande **<nowiki>((</nowiki>** évalue une expression arithmétique avant de la tester. | ||
==== Mauvais usages ==== | ==== Mauvais usages ==== | ||
Ligne 456: | Ligne 524: | ||
let -42 \< 0 ; echo $? | let -42 \< 0 ; echo $? | ||
let 0 == 0 ; echo $? | let 0 == 0 ; echo $? | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
bash: let: < : erreur de syntaxe : opérande attendu (le symbole erroné est « < ») | bash: let: < : erreur de syntaxe : opérande attendu (le symbole erroné est « < ») | ||
1 | 1 | ||
Ligne 473: | Ligne 540: | ||
let 'n==42' ; echo $? | let 'n==42' ; echo $? | ||
let '$n > 42' ; echo $? | let '$n > 42' ; echo $? | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
0 | 0 | ||
bash: let: $n == 42 : erreur de syntaxe : opérande attendu (le symbole erroné est « $n == 42 ») | bash: let: $n == 42 : erreur de syntaxe : opérande attendu (le symbole erroné est « $n == 42 ») | ||
Ligne 485: | Ligne 551: | ||
Démonstration : | Démonstration : | ||
- | __Rappels :__\\ | + | <note> |
- | La commande **printf "\n"**, renvoit un saut de ligne.\\ | + | La commande **printf "\n"**, renvoie un saut de ligne.\\ |
La commande **echo -n**, n'ajoute pas de saut ligne à la fin de son retour. | La commande **echo -n**, n'ajoute pas de saut ligne à la fin de son retour. | ||
+ | </note> | ||
<code user> | <code user> | ||
Ligne 506: | Ligne 573: | ||
cd $p | cd $p | ||
rm -rfv /tmp/test_let | rm -rfv /tmp/test_let | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
bash: let: une expression est attendue | bash: let: une expression est attendue | ||
1 | 1 | ||
Ligne 548: | Ligne 614: | ||
</file> | </file> | ||
- | Les opérandes ne peuvent être des chaînes de caractères contenant des espaces. | ||
- | __Rappel :__ L'option **-e** de la commande **echo** permet de développer les caractères protégés, (ici **\n** qui se développe en saut de ligne).\\ | + | Les opérandes ne peuvent être des chaînes de caractères contenant des espaces. |
+ | <note> | ||
+ | L'option **-e** de la commande **echo** permet de développer les caractères protégés, (ici **\n** qui se développe en saut de ligne).\\ | ||
Le développement des caractères protégés se réalisent entre guillemets doubles.\\ | Le développement des caractères protégés se réalisent entre guillemets doubles.\\ | ||
Sans guillemets, il est nécessaire de protéger le caractère de protection (**\\n**). | Sans guillemets, il est nécessaire de protéger le caractère de protection (**\\n**). | ||
+ | </note> | ||
<code user> | <code user> | ||
Ligne 567: | Ligne 635: | ||
unset n | unset n | ||
- | </code> | + | </code><file> |
- | <file config retour des commandes> | + | |
bash: ((: Du texte >= 0 : erreur de syntaxe dans l'expression (le symbole erroné est « texte >= 0 ») | bash: ((: Du texte >= 0 : erreur de syntaxe dans l'expression (le symbole erroné est « texte >= 0 ») | ||
* (("Du texte" >= 0)) renvoie le code de retour 1 | * (("Du texte" >= 0)) renvoie le code de retour 1 | ||
Ligne 583: | Ligne 650: | ||
<note> | <note> | ||
- | Remarquons que les commandes **let** et **<nowiki>((</nowiki>** renvoient le code de retour **1** quand elles sont en erreur. Ce n'est pas la norme pour une commande interne de bash. Le code de retour devrait être **2**. | + | Remarquons que les commandes **let** et **<nowiki>((</nowiki>** renvoient **le code de retour 1** quand elles sont en erreur. Ce n'est pas la norme pour une commande interne de bash. Le code de retour devrait être **2**. |
</note> | </note> | ||
- | |||
- | ==== Exemple dans un script ==== | ||
- | |||
- | Copions le code ci-dessous dans un fichier nommé mon_script. | ||
- | |||
- | <code bash 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 | ||
- | </code> | ||
- | |||
- | Et exécutons le. | ||
- | |||
- | <code user> | ||
- | bash mon_script | ||
- | echo $? | ||
- | |||
- | rm -v mon_script | ||
- | </code> | ||
- | <file config retour de la commande> | ||
- | 8 n'est pas inférieur à 2 | ||
- | 0 | ||
- | 'mon_script' supprimé | ||
- | </file> | ||
- | |||
- | __Remarque :__ L’exécution du script renverra toujours **0** (true), car le code de retour renvoyé est celui de la dernière commande exécutée, qui est **echo**.\\ | ||
- | (voir [[doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests#utiliser-la-commande-exit|utilisation de la commande exit]]). | ||
- | |||
- | ==== Exemple dans une fonction === | ||
- | |||
- | Nous créons ici une fonction (test_si_négatif) qui teste si une expression numérique ou arithmétique est négative. | ||
- | |||
- | __Rappel :__ La commande **return** est identique à la commande **exit** (**return** s'utilise dans une fonction, **exit** dans un script). | ||
- | |||
- | <code user> | ||
- | test_si_négatif() { | ||
- | # Test_si_négatif <expression> | ||
- | # Retourne le code de retour 0 si <experssion> est négative | ||
- | # Retourne le code de retour 1 si <experssion> est positive | ||
- | # Retourne le code de reour 2 si la fonction est mal utilisée | ||
- | local rc=2 # Initialise le paramètre rc avec la valeur 2 | ||
- | if (( $# == 0 )) # Test si le nombre d'argument est 0 | ||
- | then # Si oui, | ||
- | echo "Argument manquant" >&2 # Retourne un message sur le canal d'erreur | ||
- | elif (( $# > 1 )) # Si non, test si le nombre d'argument est > à 1 | ||
- | then # Si oui | ||
- | echo "Trop d'arguments" >&2 # Retourne un message sur le canal d'erreur. | ||
- | elif (($1 >= 0)) # Si non, test si l'argument est positif ou égale à 0 | ||
- | then # Si oui, | ||
- | rc=1 # Affecte 1 au paramètre rc | ||
- | elif (($1 < 0)) # Si non, test si l'argument est négatif | ||
- | then # Si oui, | ||
- | rc=0 # Affecte 0 au paramètre rc | ||
- | fi | ||
- | return $rc # Affecte $rc au code retour | ||
- | } | ||
- | |||
- | test_si_négatif ; echo -e $?\\n | ||
- | test_si_négatif 42 ; echo $? | ||
- | test_si_négatif -42 ; echo $? | ||
- | test_si_négatif 42-84 ; echo $? | ||
- | |||
- | unset test_si_négatif | ||
- | </code> | ||
- | |||
- | Le troisième usage de notre fonction montre que la commande **<nowiki>((</nowiki>** évalue une expression arithmétique avant de la tester. | ||
- | |||
- | <file config retour des commandes> | ||
- | Argument manquant | ||
- | 2 | ||
- | |||
- | 1 | ||
- | 0 | ||
- | 0 | ||
- | </file> | ||
Ligne 716: | Ligne 704: | ||
=====Tuto précédent===== | =====Tuto précédent===== | ||
- | [[doc:programmation:shells:la-page-man-bash-ii-les-operateurs-lexicographiques|Bash : les opérateurs lexicographiques]] | + | [[atelier:chantier:bash:les-operateurs-de-test-sur-fichiers|Bash : Les opérateurs de test sur fichiers]] |
=====La suite c'est ici : ===== | =====La suite c'est ici : ===== | ||
[[doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques|Bash : les symboles dans les calculs]] | [[doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques|Bash : les symboles dans les calculs]] | ||
+ |