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 16:30] agp91 [Introduction] |
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 215: | Ligne 219: | ||
Syntaxe : | Syntaxe : | ||
<code> | <code> | ||
- | [ expr opérateur expr ] | + | test expr1 OP expr2 |
- | [[ expr opérateur expr ]] | + | [ expr1 OP expr2 ] |
+ | [[ expr1 OP expr2 ]] | ||
+ | |||
+ | 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 OP l'un des opérateurs du tableau suivant. | ||
</code> | </code> | ||
- | | Opérateurs de comparaison des commande [ et <nowiki>[[</nowiki> || | + | __Rappel :__ Les commandes **[** et **test** sont équivalentes. |
+ | |||
+ | | Opérateurs de comparaison des commandes [ et <nowiki>[[</nowiki> || | ||
^Caractères ^ Significations ^ | ^Caractères ^ Significations ^ | ||
|''-eq '' | est égal à | | |''-eq '' | est égal à | | ||
Ligne 228: | Ligne 239: | ||
|''-le '' |est plus petit ou égal à | | |''-le '' |est plus petit ou égal à | | ||
- | + | ==== Exemples dans le terminal ==== | |
- | ===Exemples dans le terminal === | + | |
<code user> | <code user> | ||
- | [ 25 -eq 20 ] | + | [ 25 -eq 20 ] # Teste si 25 est égale à 20 |
echo $? | echo $? | ||
</code> | </code> | ||
Ligne 237: | Ligne 248: | ||
1 | 1 | ||
</file> | </file> | ||
- | |||
- | == Ou encore : == | ||
<code user> | <code user> | ||
var1=17 | var1=17 | ||
var2=18 | var2=18 | ||
- | [ "$var1" -gt "$var2" ] | + | echo "$var1 est-il plus grand que $var2 : $([ $var1 -gt $var2 ]; echo $?)" |
- | echo $? | + | echo "$var1 est-il plus petit que $var2 : $([[ $var1 -lt $var2 ]]; echo $?)" |
+ | echo "$var1 est-il différent de $var2 : $(test $var1 -ne $var2 ; echo $?)" | ||
+ | |||
+ | unset var1 var2 | ||
</code> | </code> | ||
- | == OU mieux : == | + | <file config retour de la commande> |
+ | 17 est-il plus grand que 18 : 1 | ||
+ | 17 est-il plus petit que 18 : 0 | ||
+ | 17 est-il différent de 18 : 0 | ||
+ | </file> | ||
+ | |||
+ | Seule la commande **<nowiki>[[</nowiki>** permet de tester une expression arithmétique. | ||
<code user> | <code user> | ||
- | test 100 -gt 99 && echo "vrai" || echo "faux" # retour : vrai | + | test 21+21 -eq 42 ; echo -e $?\\n |
+ | |||
+ | [ 21*2 -eq 42 ] ; echo -e $?\\n | ||
+ | |||
+ | [[ 84-42 -eq 42 ]] ; echo $? | ||
</code> | </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> | <code user> | ||
- | test 100 -lt 99 && echo "vrai" || echo "faux" # retour : faux | + | [[ 0 -eq "" ]] ; echo $? |
+ | [[ "" -ne 0 ]] ; echo $? | ||
+ | [[ "" -eq "" ]] ; echo $? | ||
</code> | </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> | <code user> | ||
- | [ 5 -eq 5 ]; echo $? | + | test 42 -eq "" ; echo $? |
+ | [ 42 -lt "" ] ; echo $? | ||
+ | echo ===== | ||
+ | test "" -gt 42 ; echo $? | ||
+ | [ "" -ge 42 ] ; echo $? | ||
</code> | </code> | ||
- | + | <file config retour des commande> | |
- | <file config retour de la commande> | + | bash: test: : nombre entier attendu comme expression |
- | 0 | + | 2 |
+ | bash: [: : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | ===== | ||
+ | bash: test: : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [: : nombre entier attendu comme expression | ||
+ | 2 | ||
</file> | </file> | ||
- | >car l'expression est vraie | ||
- | === Exemple avec la commande test dans le terminal:=== | + | Les deux opérandes sont obligatoires |
<code user> | <code user> | ||
- | test 17 -gt 11 ; echo $? | + | test 42 -eq ; echo $? |
+ | [ 42 -lt ] ; echo $? | ||
+ | [[ 42 -ne ]] | ||
+ | echo $? | ||
+ | echo ===== | ||
+ | test -gt 42 ; echo $? | ||
+ | [ -ge 42 ] ; echo $? | ||
+ | [[ -le 42 ]] | ||
+ | echo $? | ||
</code> | </code> | ||
- | + | <file config retour des commandes> | |
- | <file config retour de la commande> | + | bash: test: 42 : opérateur unaire attendu |
- | 0 | + | 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> | </file> | ||
- | De même : | + | |
+ | Les espaces sont obligatoires | ||
<code user> | <code user> | ||
- | var1=17 ; var2=11 ; test "$var1" -gt "$var2" ; echo $? | + | [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> | </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> | ||
- | <file config retour de la commande> | + | __Rappel :__ Le code retour 127, signifie que la commande n'a pas été trouvée. |
- | 0 | + | |
+ | 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> | </file> | ||
- | ===Exemple avec les crochets dans un script:=== | + | |
- | <code bash mon-script> | + | ==== Exemples dans un script ==== |
- | #!/bin/bash | + | |
- | a=2 ; b=1 | + | Copions le code ci-dessous dans le fichier mon_script. |
- | if [ "$a" -gt "$b" ] ; then | + | |
- | echo "$a est plus grand que $b" | + | <code bash mon_script> |
- | fi | + | #!/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 307: | 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> |