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 Les deux révisions suivantes | ||
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [14/02/2023 17:55] agp91 [Comparaison numérique avec [ et [[] |
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [15/02/2023 00:03] agp91 [Comparaison numérique avec [ et [[] |
||
---|---|---|---|
Ligne 218: | Ligne 218: | ||
[ expr1 OP expr2 ] | [ expr1 OP expr2 ] | ||
[[ expr1 OP expr2 ]] | [[ expr1 OP expr2 ]] | ||
+ | | ||
expr1 et expr2 sont sujets au développement des paramètres. | expr1 et expr2 sont sujets au développement des paramètres. | ||
Avec la commande [[, expr1 et expr2 sont sujets à l’évaluation arithmétique (la commande [, ne le permet pas). | Avec la commande [[, expr1 et expr2 sont sujets à l’évaluation arithmétique (la commande [, ne le permet pas). | ||
Avec OP l'un des opérateurs du tableau suivant. | Avec OP l'un des opérateurs du tableau suivant. | ||
</code> | </code> | ||
+ | |||
+ | __Rappel :__ Les commandes **[** et **test** sont équivalentes. | ||
| Opérateurs de comparaison des commandes [ et <nowiki>[[</nowiki> || | | Opérateurs de comparaison des commandes [ et <nowiki>[[</nowiki> || | ||
Ligne 233: | Ligne 235: | ||
|''-le '' |est plus petit ou égal à | | |''-le '' |est plus petit ou égal à | | ||
- | |||
==== Exemples dans le terminal ==== | ==== Exemples dans le terminal ==== | ||
Ligne 259: | Ligne 260: | ||
</file> | </file> | ||
- | ===Exemple avec les crochets dans un script:=== | + | Seule la commande **<nowiki>[[</nowiki>** permet de tester une expression arithmétique. |
- | <code bash mon-script> | + | |
- | #!/bin/bash | + | <code user> |
- | a=2 ; b=1 | + | test 21+21 -eq 42 ; echo -e $?\\n |
- | if [ "$a" -gt "$b" ] ; then | + | |
- | echo "$a est plus grand que $b" | + | [ 21*2 -eq 42 ] ; echo -e $?\\n |
- | fi | + | |
+ | [[ 84-42 -eq 42 ]] ; echo $? | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | bash: test: 21+21 : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | |||
+ | bash: [: 21*2 : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | |||
+ | 0 | ||
+ | </file> | ||
+ | |||
+ | __Rappel :__ Lorsque le code 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és à 0. | ||
+ | |||
+ | <code user> | ||
+ | [[ 0 -eq "" ]] ; echo $? | ||
+ | [[ "" -ne 0 ]] ; echo $? | ||
+ | [[ "" -eq "" ]] ; echo $? | ||
+ | </code> | ||
+ | <file config retour des commande> | ||
+ | 0 | ||
+ | 1 | ||
+ | 0 | ||
+ | </file> | ||
+ | |||
+ | ==== Mauvais usages ==== | ||
+ | |||
+ | Les chaînes vides sont à proscrire avec la commande **[** (ou **test**). | ||
+ | |||
+ | <code user> | ||
+ | test 42 -eq "" ; echo $? | ||
+ | [ 42 -lt "" ] ; echo $? | ||
+ | echo ===== | ||
+ | test "" -gt 42 ; echo $? | ||
+ | [ "" -ge 42 ] ; echo $? | ||
+ | </code> | ||
+ | <file config retour des commande> | ||
+ | bash: test: : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [: : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | ===== | ||
+ | bash: test: : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [: : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | </file> | ||
+ | |||
+ | Les deux opérandes sont obligatoires | ||
+ | |||
+ | <code user> | ||
+ | test 42 -eq ; echo $? | ||
+ | [ 42 -lt ] ; echo $? | ||
+ | [[ 42 -ne ]] | ||
+ | echo $? | ||
+ | echo ===== | ||
+ | test -gt 42 ; echo $? | ||
+ | [ -ge 42 ] ; echo $? | ||
+ | [[ -le 42 ]] | ||
+ | echo $? | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | bash: test: 42 : opérateur unaire attendu | ||
+ | 2 | ||
+ | bash: [: 42 : opérateur unaire attendu | ||
+ | 2 | ||
+ | bash: argument « ]] » inattendu pour l'opérateur binaire conditionnel | ||
+ | bash: erreur de syntaxe près de « ]] » | ||
+ | 2 | ||
+ | ===== | ||
+ | bash: test: -gt : opérateur unaire attendu | ||
+ | 2 | ||
+ | bash: [: -ge : opérateur unaire attendu | ||
+ | 2 | ||
+ | bash: opérateur binaire conditionnel attendu | ||
+ | bash: erreur de syntaxe près de « 42 » | ||
+ | 2 | ||
+ | </file> | ||
+ | |||
+ | Les espaces sont obligatoires | ||
+ | <code user> | ||
+ | [24 -ne 24 ] ; echo $? | ||
+ | [[24 -le 24 ]] | ||
+ | echo $? | ||
+ | echo ==== | ||
+ | [ 24 -ne 24] ; echo $? | ||
+ | [[ 24 -le 24]] | ||
+ | echo $? | ||
+ | echo ==== | ||
+ | test 42-gt 0 ; echo $? | ||
+ | [ 42 -eq0 ] ; echo $? | ||
+ | [[ 42 -ne0 ]] | ||
+ | echo $? | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | bash: [24 : commande introuvable | ||
+ | 127 | ||
+ | bash: [[24 : commande introuvable | ||
+ | 127 | ||
+ | ==== | ||
+ | bash: [: « ] » manquant | ||
+ | 2 | ||
+ | bash: erreur de syntaxe dans une expression conditionnelle | ||
+ | bash: erreur de syntaxe près de « echo » | ||
+ | ==== | ||
+ | bash: test: 42-gt : opérateur unaire attendu | ||
+ | 2 | ||
+ | bash: [: 42 : opérateur unaire attendu | ||
+ | 2 | ||
+ | bash: opérateur binaire conditionnel attendu | ||
+ | bash: erreur de syntaxe près de « -ne0 » | ||
+ | 2 | ||
+ | </file> | ||
+ | |||
+ | __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 chaine de carractères\\ | ||
+ | Puisqu'elle est non vide, le test n'échoue pas. | ||
+ | <code> | ||
+ | test 420-ne420 | ||
+ | [ 420-gt42 ] ; echo $? | ||
+ | [[ 42-lt420 ]]; echo $? | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | 0 | ||
+ | 0 | ||
+ | 0 | ||
+ | </file> | ||
+ | |||
+ | ==== Exemples dans un script ==== | ||
+ | |||
+ | Copions le code ci-dessous dans le fichier mon_script. | ||
+ | |||
+ | <code bash mon_script> | ||
+ | #!/bin/bash | ||
+ | a=2 ; b=1 | ||
+ | if [ "$a" -gt "$b" ] ; then | ||
+ | echo "$a est plus grand que $b" | ||
+ | fi | ||
</code> | </code> | ||
<code user> | <code user> | ||
- | ./mon-script : | + | bash mon_script |
+ | rm -f mon_script | ||
</code> | </code> | ||
<file config retour de la commande> | <file config retour de la commande> | ||
2 est plus grand que 1 | 2 est plus grand que 1 | ||
+ | 'mon_script' supprimé | ||
</file> | </file> | ||
Ligne 287: | Ligne 431: | ||
<code user> | <code user> | ||
- | ./mon-script | + | bash mon-script |
</code> | </code> | ||
<file config retour de la commande> | <file config retour de la commande> |