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 Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [15/02/2023 18:40] agp91 [Comparaison numérique avec ((] |
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [16/02/2023 09:25] agp91 [Comparaison numérique avec ((] |
||
---|---|---|---|
Ligne 43: | Ligne 43: | ||
<code> | <code> | ||
let <expr1><OP><expr2> | let <expr1><OP><expr2> | ||
+ | let "<expr1> <OP> <expr2>" | ||
(( <expr1> <OP> <expr2> )) | (( <expr1> <OP> <expr2> )) | ||
<expr1> et <expr2> sont sujets au développement des paramètres et à l’évaluation arithmétique. | <expr1> et <expr2> sont sujets au développement des paramètres et à l’évaluation arithmétique. | ||
Avec <OP> l'un des opérateurs donnés dans le tableau suivant. | Avec <OP> l'un des opérateurs donnés dans le tableau suivant. | ||
- | Avec la commande let, les opérateurs commençant par < ou > doivent être protégés (voir plus bas : Mauvais usages). | ||
</code> | </code> | ||
- | __Remarque :__ Les commandes **let** et **<nowiki>((</nowiki>** sont pratiquement équivalentes (voir les différences plus bas Mauvais usages). | + | __Remarques :__ Les commandes **let** et **<nowiki>((</nowiki>** sont équivalentes. |
- | | Opérateurs de comparaison numérique de la commande <nowiki>((</nowiki> || | + | | Opérateurs de comparaison numérique des commandes let et <nowiki>((</nowiki> || |
^ Opérateurs ^ Description ^ | ^ Opérateurs ^ Description ^ | ||
| '' == '' | Comparaison d'une égalité | | | '' == '' | Comparaison d'une égalité | | ||
Ligne 60: | Ligne 60: | ||
| '' < '' | Comparaison de plus petit que | | | '' < '' | Comparaison de plus petit que | | ||
| ''<nowiki><=</nowiki> '' | Comparaison de plus petit ou égal que | | | ''<nowiki><=</nowiki> '' | Comparaison de plus petit ou égal que | | ||
+ | |||
+ | |||
+ | 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 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]].) | ||
==== Exemples dans le terminal ==== | ==== Exemples dans le terminal ==== | ||
Ligne 79: | Ligne 85: | ||
(( $nombre1 > $nombre2 )) # Est-ce-que nombre1 (12) est strictement supérieur au nombre2 (13). | (( $nombre1 > $nombre2 )) # Est-ce-que nombre1 (12) est strictement supérieur au nombre2 (13). | ||
echo $? # Affiche le code de retour. | echo $? # Affiche le code de retour. | ||
- | let $nombre1!=$nombre2 #Est-ce-que nombre1 (12) est différent du nombre2 (13) | + | let "$nombre1 != $nombre2" #Est-ce-que nombre1 (12) est différent du nombre2 (13) |
echo $? # Affiche le code de retour. | echo $? # Affiche le code de retour. | ||
Ligne 104: | Ligne 110: | ||
</file> | </file> | ||
- | Comme nous l'avons vu au dessus, les paramètre n'ont pas besoin du caractère **$** pour être développé.\\ | + | Comme nous l'avons vu au dessus, les paramètres n'ont pas besoin du caractère **$** pour être développés.\\ |
Un simple mot sera alors interprété comme un paramètre.\\ | Un simple mot sera alors interprété comme un paramètre.\\ | ||
- | Si ce paramètre n'existe pas, son développent retournera 0. | + | Si ce paramètre n'existe pas, le mot sera substitué par **0**. |
<code user> | <code user> | ||
(("mot" == 0)) | (("mot" == 0)) | ||
echo '(("mot" == 0)) revoie le code de retour' $? | echo '(("mot" == 0)) revoie le code de retour' $? | ||
- | let mot\<=0 | + | let "mot <= 0" |
- | echo 'let "mot"\<=0 revoie le code de retour' $? | + | echo 'let "mot <= 0" revoie le code de retour' $? |
n="mot" | n="mot" | ||
Ligne 124: | Ligne 130: | ||
<file config retour des commandes> | <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 |
Avec n="mot" ; ((n!=0)) renvoie le code de retour 1 | Avec n="mot" ; ((n!=0)) renvoie le code de retour 1 | ||
Avec n="mot" ; let n==0 renvoie le code de retour 0 | Avec n="mot" ; let n==0 renvoie le code de retour 0 | ||
</file> | </file> | ||
+ | Si un paramètre existe mais que sa valeur est vide, son développement retournera 0. | ||
+ | <code user> | ||
+ | n= | ||
+ | ((n==0)) ; echo $? | ||
+ | let 'n != 0' ; echo $? | ||
+ | |||
+ | unset n | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | 0 | ||
+ | 1 | ||
+ | </file> | ||
Avec la commande **<nowiki>((</nowiki>**, les espaces ne sont pas obligatoires. | Avec la commande **<nowiki>((</nowiki>**, les espaces ne sont pas obligatoires. | ||
<code user> | <code user> | ||
Ligne 148: | Ligne 166: | ||
==== Mauvais usages ==== | ==== Mauvais usages ==== | ||
- | La commande **let** ne supporte pas les espaces entre les opérandes et l'opérateur. | + | Avec la commande **let**, si l'expression à évaluer n'est pas protégée,\\ |
+ | Les espaces entre les opérandes et l'opérateur ne sont pas supportés. | ||
<code user> | <code user> | ||
Ligne 161: | Ligne 180: | ||
</file> | </file> | ||
- | Avec la commande **let**, les opérateurs **<**, **<nowiki><=</nowiki>**, **>** et **>=** doivent être protégés.\\ | ||
- | Les trois types de protection (**\**, entre guillemets simples **<nowiki>''</nowiki>** et entre guillemets double **""** fonctionnent.\\ | + | Avec la commande **let**, si l'expression à évaluer est protégé par des guillemets simples,\\ |
+ | Les paramètres sont développés uniquement s'ils ne disposent pas du caractère **$**.\\ | ||
+ | S'il est fourni, une erreur est renvoyée. | ||
+ | |||
+ | <code user> | ||
+ | n=42 | ||
+ | let 'n==42' ; echo $? | ||
+ | let '$n > 42' ; echo $? | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | 0 | ||
+ | bash: let: $n == 42 : erreur de syntaxe : opérande attendu (le symbole erroné est « $n == 42 ») | ||
+ | 1 | ||
+ | </file> | ||
+ | |||
+ | Avec la commande **let**, si l'expression à évaluer n'est pas protégée, les opérateurs **<**, **<nowiki><=</nowiki>**, **>** et **>=** doivent être protégés.\\ | ||
+ | Les trois types de protection (**\**, entre guillemets simples **<nowiki>''</nowiki>** et entre guillemets doubles **""** fonctionnent.\\ | ||
S'ils ne sont pas protégés, les opérateurs **<** et **>** sont des opérateurs de redirection.\\ | S'ils ne sont pas protégés, les opérateurs **<** et **>** sont des opérateurs de redirection.\\ | ||
Démonstration : | Démonstration : | ||
__Rappels :__\\ | __Rappels :__\\ | ||
- | La commande **printf "\n"**, retourne un saut de ligne.\\ | + | La commande **printf "\n"**, renvoit 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. | ||
Ligne 209: | Ligne 243: | ||
Les opérateurs **<** et **<nowiki><=</nowiki>** ont recherché les fichiers **423** et **=424**, sans les trouver. | Les opérateurs **<** et **<nowiki><=</nowiki>** ont recherché les fichiers **423** et **=424**, sans les trouver. | ||
- | Les opérateur de comparaison sont des opérateurs binaires, ils attendent donc 2 arguments (ou opérandes).\\ | + | Les opérateurs de comparaison sont des opérateurs binaires, ils attendent donc 2 arguments (ou opérandes).\\ |
Les commande **<nowiki>((</nowiki>** et **let** retournent une erreur s'il manque un opérande. | Les commande **<nowiki>((</nowiki>** et **let** retournent une erreur s'il manque un opérande. | ||
<code> | <code> | ||
Ligne 234: | Ligne 268: | ||
__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).\\ | __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).\\ | ||
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égé le caractère de protection (**\\n**). | + | Sans guillemets, il est nécessaire de protéger le caractère de protection (**\\n**). |
- | <code> | + | <code user> |
- | echo ===== | + | |
(("Du texte" >= 0)) | (("Du texte" >= 0)) | ||
- | echo -e '(("Du texte" >= 0)) revoie le code de retour' $?\\n | + | echo -e '* (("Du texte" >= 0)) renvoie le code de retour' $?\\n |
let 424\>"Du texte" | let 424\>"Du texte" | ||
- | echo -e 'let 424\>"Du texte" revoie le code de retour' $?\\n | + | echo -e '* let 424\>"Du texte" renvoie le code de retour' $?\\n |
- | echo ===== | + | |
n="Du texte" | n="Du texte" | ||
((0<=n)) | ((0<=n)) | ||
- | echo -e "Avec n=\"$n\" ; ((0<=n)) renvoie le code retour $?\n" | + | echo -e "* Avec n=\"$n\" ; ((0<=n)) renvoie le code retour $?\n" |
let n==0 | let n==0 | ||
- | echo -"Avec n=\"${n}\" ; let n==0 renvoie le code retour $?" | + | echo "* Avec n=\"${n}\" ; let n==0 renvoie le code retour $?" |
+ | |||
+ | unset n | ||
</code> | </code> | ||
+ | <file config retour des commandes> | ||
+ | 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 | ||
+ | |||
+ | bash: let: 424>Du texte : erreur de syntaxe dans l'expression (le symbole erroné est « texte ») | ||
+ | * let 424\>"Du texte" renvoie le code de retour 1 | ||
+ | |||
+ | bash: ((: Du texte : erreur de syntaxe dans l'expression (le symbole erroné est « texte ») | ||
+ | * Avec n="Du texte" ; ((0<=n)) renvoie le code retour 1 | ||
+ | |||
+ | bash: let: Du texte : erreur de syntaxe dans l'expression (le symbole erroné est « texte ») | ||
+ | * Avec n="Du texte" ; let n==0 renvoie le code retour 1 | ||
+ | </file> | ||
+ | |||
+ | <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**. | ||
+ | </note> | ||
==== Exemple dans un script ==== | ==== Exemple dans un script ==== | ||
Ligne 278: | Ligne 330: | ||
</file> | </file> | ||
- | __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.\\ | + | __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]]). | (voir [[doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests#utiliser-la-commande-exit|utilisation de la commande exit]]). | ||
Ligne 285: | Ligne 337: | ||
Nous créons ici une fonction (test_si_négatif) qui teste si une expression numérique ou arithmétique est négative. | 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). | + | __Rappel :__ La commande **return** est identique à la commande **exit** (**return** s'utilise dans une fonction, **exit** dans un script). |
<code user> | <code user> | ||
Ligne 399: | Ligne 451: | ||
</file> | </file> | ||
- | __Rappel :__ Lorsque le code de retour d'une commande interne renvoie 2, cela signifie un mauvais usage de cette commande. | + | __Rappel :__ Lorsque le code de retour d'une commande interne renvoie **2**, cela signifie un mauvais usage de cette commande. |
- | Elle est aussi la seule à accepter les chaînes vides qui sont alors évaluées à 0. | + | Elle est aussi la seule à accepter les chaînes vides qui sont alors évaluées à **0**. |
<code user> | <code user> | ||
Ligne 414: | Ligne 466: | ||
</file> | </file> | ||
- | Idem pour les chaînes de caractères sans espace (mots). Un mot est substitué par 0. | + | Idem pour les chaînes de caractères sans espace (mots). Un mot est substitué par **0**. |
<code user> | <code user> | ||
Ligne 429: | Ligne 481: | ||
==== Mauvais usages ==== | ==== Mauvais usages ==== | ||
- | Le caractère $ est obligatoire pour développer les arguments. Sans, ils sont interprétés comme des mots. | + | Le caractère **$** est obligatoire pour développer les arguments. Sans, ils sont interprétés comme des mots. |
Avec la commande **[** (ou **test**), les chaînes vides ou les mots sont à proscrire. | Avec la commande **[** (ou **test**), les chaînes vides ou les mots sont à proscrire. | ||
Ligne 486: | Ligne 538: | ||
</file> | </file> | ||
<note > | <note > | ||
- | Il est remarquable que le test ''<nowiki>[[ "Du texte" -ge 0 ]]</nowiki>'', ne renvoie pas le code de retour 2.\\ | + | Il est remarquable que le test ''<nowiki>[[ "Du texte" -ge 0 ]]</nowiki>'', ne renvoie pas le code de retour **2**.\\ |
Pourtant il s'agit bien d'un mauvais usage de la commande ''<nowiki>[[</nowiki>''. | Pourtant il s'agit bien d'un mauvais usage de la commande ''<nowiki>[[</nowiki>''. | ||
</note> | </note> | ||
Ligne 559: | Ligne 611: | ||
__Rappel :__ Le code retour 127, signifie que la commande n'a pas été trouvée. | __Rappel :__ Le code retour 127, signifie que la commande n'a pas été trouvée. | ||
- | Lorsqu'il n'y pas d'espaces entre les opérandes et l'opérateur, l'ensemble est considérer comme une chaîne de caractères\\ | + | Lorsqu'il n'y pas d'espaces entre les opérandes et l'opérateur, l'ensemble est considéré comme une chaîne de caractères\\ |
Puisque la chaîne est non vide, le test n'échoue pas. | Puisque la chaîne est non vide, le test n'échoue pas. | ||
<code user> | <code user> |