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 12:36] agp91 [Comparaison numérique avec [ et [[] |
||
---|---|---|---|
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 211: | Ligne 215: | ||
</file> | </file> | ||
===== Comparaison numérique avec [ et [[ ===== | ===== Comparaison numérique avec [ et [[ ===== | ||
- | La comparaison numérique peut aussi se réalisée avec les commandes **[** (ou **test**) et **<nowiki>[[</nowiki>**. | + | La comparaison numérique peut aussi se réaliser avec les commandes **[** (ou **test**) et **<nowiki>[[</nowiki>**. |
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 [ (ou test), 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. |
- | ^Caractères ^ Significations ^ | + | |
- | |''-eq '' | est égal à | | + | | Opérateurs de comparaison des commandes [ et <nowiki>[[</nowiki> || |
- | |''-ne '' | n'est pas égal à | | + | ^Opérateurs ^ Significations ^ |
- | |''-gt '' | est plus grand que | | + | |''-eq '' | est égal à | |
- | |''-ge '' |est plus grand ou égal à | | + | |''-ne '' | n'est pas égal à | |
- | |''-lt '' |est plus petit que | | + | |''-gt '' | est plus grand que | |
- | |''-le '' |est plus petit ou égal à | | + | |''-ge '' |est plus grand ou égal à | |
+ | |''-lt '' |est plus petit que | | ||
+ | |''-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> | ||
+ | |||
+ | ==== Particularités de la commande [[ ==== | ||
+ | |||
+ | 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 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. | ||
+ | |||
<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> | ||
+ | |||
+ | Idem pour les chaînes de caractères sans espace (mots). Un mot est substitué par 0. | ||
<code user> | <code user> | ||
- | [ 5 -eq 5 ]; echo $? | + | [[ mot -eq 0 ]] ; echo $? |
+ | [[ 0 -ne mot ]] ; echo $? | ||
+ | [[ mot1 -eq mot2 ]] ; echo $? | ||
</code> | </code> | ||
+ | <file config retour des commandes> | ||
+ | 0 | ||
+ | 1 | ||
+ | 0 | ||
+ | </file> | ||
- | <file config retour de la commande> | + | ==== Mauvais usages ==== |
- | 0 | + | |
+ | 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. | ||
+ | |||
+ | <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> | </file> | ||
- | >car l'expression est vraie | ||
- | === Exemple avec la commande test dans le terminal:=== | ||
<code user> | <code user> | ||
- | test 17 -gt 11 ; echo $? | + | test mot -eq 0 ; echo $? |
+ | [ 0 -eq mot ] ; echo $? | ||
+ | test O -le 0 ; echo $? | ||
+ | [ "mot" -ge 0 ] ; echo $? | ||
+ | echo $? | ||
</code> | </code> | ||
+ | <file config retour des commandes> | ||
+ | bash: test: mot : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [: mot : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: test: O : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [: mot : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | </file> | ||
- | <file config retour de la commande> | + | Avec **[** (ou **test**) et **<nowiki>[[</nowiki>**, les opérandes ne peuvent être des chaînes de caractères qui comportent des espaces. |
- | 0 | + | |
+ | <code user> | ||
+ | test "Du texte" -eq 0 ; echo $? | ||
+ | [ 0 -ge "Du texte" ] ; echo $? | ||
+ | [[ "Du texte" -ge 0 ]] ; echo $? | ||
+ | </code> | ||
+ | <file config retour des commandes> | ||
+ | bash: test: Du texte : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [: Du texte : nombre entier attendu comme expression | ||
+ | 2 | ||
+ | bash: [[: Du texte : erreur de syntaxe dans l'expression (le symbole erroné est « texte ») | ||
+ | 1 | ||
</file> | </file> | ||
- | De même : | + | <note > |
+ | 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>''. | ||
+ | </note> | ||
+ | |||
+ | Les deux opérandes sont obligatoires. | ||
<code user> | <code user> | ||
- | var1=17 ; var2=11 ; test "$var1" -gt "$var2" ; 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> | ||
+ | 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> | ||
- | <file config retour de la commande> | + | Ainsi que les espaces. |
- | 0 | + | |
+ | <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> | </file> | ||
- | ===Exemple avec les crochets dans un script:=== | + | |
- | <code bash mon-script> | + | __Rappel :__ Le code retour 127, signifie que la commande n'a pas été trouvée. |
- | #!/bin/bash | + | |
- | a=2 ; b=1 | + | 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\\ |
- | if [ "$a" -gt "$b" ] ; then | + | Puisque la chaîne est non vide, le test n'échoue pas. |
- | echo "$a est plus grand que $b" | + | <code user> |
- | fi | + | test 420-ne420 ; echo $? |
+ | [ 420-gt42 ] ; echo $? | ||
+ | [[ 42-lt420 ]] ; echo $? | ||
</code> | </code> | ||
+ | <file config retour des commandes> | ||
+ | 0 | ||
+ | 0 | ||
+ | 0 | ||
+ | </file> | ||
+ | Ne pas utiliser les opérateurs **<** et **>** avec **[** (ou **test**) et **<nowiki>[[</nowiki>** pour réaliser des comparaisons numériques.\\ | ||
+ | Car avec ces commandes, ces opérateur sont des opérateurs de comparaison lexicographique.\\ | ||
+ | (voir [[https://debian-facile.org/doc:programmation:shells:la-page-man-bash-ii-les-operateurs-lexicographiques|Bash : les opérateurs lexicographiques]]). | ||
+ | |||
+ | __Rappel :__ Avec **[** (ou **test**), les opérateurs **<** et **>** s'utilisent protégés (voir [[https://debian-facile.org/atelier:chantier:bash-comparaison-lexicographique-des-chaines#tests-avec1|Bash, comparaison lexicographique avec [ ou test]]). | ||
<code user> | <code user> | ||
- | ./mon-script : | + | test 425 \> 4242 ; echo $? |
+ | [ 426 \> 4242 ] ; echo $? | ||
+ | [[ 4242 < 427 ]] ; echo $? | ||
</code> | </code> | ||
- | <file config retour de la commande> | + | <file config retour des commandes> |
- | 2 est plus grand que 1 | + | 0 |
+ | 0 | ||
+ | 0 | ||
</file> | </file> | ||
- | ===Exemple avec la commande test dans un script:=== | + | Lexicographiquement 425, 426 et 427 sont supérieurs (placés après dans l'ordre lexicographique), mais sont inférieurs (plus petits) numériquement à 4242. |
+ | |||
+ | ==== 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 bash mon-script> | ||
if test 100 -gt 99 | if test 100 -gt 99 | ||
then | then | ||
Ligne 303: | Ligne 492: | ||
else | else | ||
echo "faux" | echo "faux" | ||
- | fi | + | 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 | ||
vrai | vrai | ||
+ | 'mon_script' supprimé | ||
</file> | </file> | ||
<note important> | <note important> | ||
Attention : | Attention : | ||
- | <code bash mon-script> | + | <code bash mon_script> |
#!/bin/bash | #!/bin/bash | ||
var1=8 | var1=8 | ||
Ligne 322: | Ligne 515: | ||
echo " $var1 est plus grand que $var2 " | echo " $var1 est plus grand que $var2 " | ||
fi | fi | ||
- | echo " " | + | printf \\n |
- | if test 8 -gt 7 ; then | + | test 8 -gt 7 && echo "$var1 est plus grand que $var2" |
- | echo " $var1 est plus grand que $var2 " | + | |
- | fi | + | |
</code> | </code> | ||
<code user> | <code user> | ||
- | ./mon-script | + | bash mon_script |
+ | |||
+ | rm -v mon_script | ||
</code> | </code> | ||
<file config retour de la commande> | <file config retour de la commande> | ||
- | : ligne 18 : test: : nombre entier attendu comme expression | + | mon_script: ligne 4 : test: : nombre entier attendu comme expression |
- | + | ||
- | 8 est plus grand que 7 | + | 8 est plus grand que 7 |
+ | 'mon_script' supprimé | ||
</file> | </file> | ||
</note> | </note> |