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 [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 01:28] agp91 [Comparaison numérique avec ((] |
||
---|---|---|---|
Ligne 186: | Ligne 186: | ||
then # Si oui | then # Si oui | ||
echo "Trop d'arguments" >&2 # Retourne un message sur le canal d'erreur. | echo "Trop d'arguments" >&2 # Retourne un message sur le canal d'erreur. | ||
- | elif (($1 >= 0)) # Si non, test si l'argument est négatif | + | elif (($1 >= 0)) # Si non, test si l'argument est positif ou égale à 0 |
then # Si oui, | then # Si oui, | ||
rc=1 # Affecte 1 au paramètre rc | rc=1 # Affecte 1 au paramètre rc | ||
- | elif (($1 < 0)) # Si non, test si l'argument est positif | + | elif (($1 < 0)) # Si non, test si l'argument est négatif |
then # Si oui, | then # Si oui, | ||
rc=0 # Affecte 0 au paramètre rc | rc=0 # Affecte 0 au paramètre rc | ||
Ligne 196: | Ligne 196: | ||
} | } | ||
+ | test_si_négatif ; echo -e $?\\n | ||
test_si_négatif 42 ; echo $? | test_si_négatif 42 ; echo $? | ||
test_si_négatif -42 ; echo $? | test_si_négatif -42 ; echo $? | ||
Ligne 206: | Ligne 207: | ||
<file config retour des commandes> | <file config retour des commandes> | ||
+ | Argument manquant | ||
+ | 2 | ||
+ | |||
1 | 1 | ||
0 | 0 | ||
Ligne 218: | Ligne 222: | ||
[ 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 239: | ||
|''-le '' |est plus petit ou égal à | | |''-le '' |est plus petit ou égal à | | ||
- | |||
==== Exemples dans le terminal ==== | ==== Exemples dans le terminal ==== | ||
Ligne 259: | Ligne 264: | ||
</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 435: | ||
<code user> | <code user> | ||
- | ./mon-script | + | bash mon-script |
</code> | </code> | ||
<file config retour de la commande> | <file config retour de la commande> |