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 [20/02/2023 21:29] agp91 [Introduction] |
doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique [20/02/2023 21:31] agp91 [Conclusion sur les opérateurs lexicographiques et les opérateurs de comparaison numérique] |
||
---|---|---|---|
Ligne 664: | Ligne 664: | ||
0 | 0 | ||
</file> | </file> | ||
- | ===== Comparaison numérique avec [ et [[ ===== | ||
- | La comparaison numérique peut aussi se réaliser avec les commandes **[** (ou **test**) et **<nowiki>[[</nowiki>**. | ||
- | Syntaxe : | ||
- | <code> | ||
- | test expr1 OP expr2 | ||
- | [ 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> | ||
- | |||
- | __Rappel :__ Les commandes **[** et **test** sont équivalentes. | ||
- | |||
- | | Opérateurs de comparaison des commandes [ et <nowiki>[[</nowiki> || | ||
- | ^Opérateurs ^ Significations ^ | ||
- | |''-eq '' | est égal à | | ||
- | |''-ne '' | n'est pas égal à | | ||
- | |''-gt '' | est plus grand que | | ||
- | |''-ge '' |est plus grand ou égal à | | ||
- | |''-lt '' |est plus petit que | | ||
- | |''-le '' |est plus petit ou égal à | | ||
- | |||
- | ==== Exemples dans le terminal ==== | ||
- | |||
- | <code user> | ||
- | [ 25 -eq 20 ] # Teste si 25 est égale à 20 | ||
- | echo $? | ||
- | </code> | ||
- | <file config retour de la commande> | ||
- | 1 | ||
- | </file> | ||
- | |||
- | <code user> | ||
- | var1=17 | ||
- | var2=18 | ||
- | echo "$var1 est-il plus grand que $var2 : $([ $var1 -gt $var2 ]; 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> | ||
- | <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> | ||
- | test 21+21 -eq 42 ; echo -e $?\\n | ||
- | |||
- | [ 21*2 -eq 42 ] ; echo -e $?\\n | ||
- | |||
- | [[ 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 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> | ||
- | [[ 0 -eq "" ]] ; echo $? | ||
- | [[ "" -ne 0 ]] ; echo $? | ||
- | [[ "" -eq "" ]] ; echo $? | ||
- | </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> | ||
- | [[ mot -eq 0 ]] ; echo $? | ||
- | [[ 0 -ne mot ]] ; echo $? | ||
- | [[ mot1 -eq mot2 ]] ; echo $? | ||
- | </code> | ||
- | <file config retour des commandes> | ||
- | 0 | ||
- | 1 | ||
- | 0 | ||
- | </file> | ||
- | |||
- | ==== Mauvais usages ==== | ||
- | |||
- | 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> | ||
- | |||
- | <code user> | ||
- | test mot -eq 0 ; echo $? | ||
- | [ 0 -eq mot ] ; echo $? | ||
- | test O -le 0 ; echo $? | ||
- | [ "mot" -ge 0 ] ; echo $? | ||
- | echo $? | ||
- | </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> | ||
- | |||
- | Avec **[** (ou **test**) et **<nowiki>[[</nowiki>**, les opérandes ne peuvent être des chaînes de caractères qui comportent des espaces. | ||
- | |||
- | <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> | ||
- | <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> | ||
- | 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> | ||
- | |||
- | Ainsi que les espaces. | ||
- | |||
- | <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éré comme une chaîne de caractères\\ | ||
- | Puisque la chaîne est non vide, le test n'échoue pas. | ||
- | <code user> | ||
- | test 420-ne420 ; echo $? | ||
- | [ 420-gt42 ] ; echo $? | ||
- | [[ 42-lt420 ]] ; echo $? | ||
- | </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> | ||
- | test 425 \> 4242 ; echo $? | ||
- | [ 426 \> 4242 ] ; echo $? | ||
- | [[ 4242 < 427 ]] ; echo $? | ||
- | </code> | ||
- | <file config retour des commandes> | ||
- | 0 | ||
- | 0 | ||
- | 0 | ||
- | </file> | ||
- | |||
- | 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 | ||
- | |||
- | if test 100 -gt 99 | ||
- | then | ||
- | echo "vrai" #réponse : vrai | ||
- | else | ||
- | echo "faux" | ||
- | fi | ||
- | </code> | ||
- | |||
- | <code user> | ||
- | bash mon_script | ||
- | |||
- | rm -f mon_script | ||
- | </code> | ||
- | <file config retour de la commande> | ||
- | 2 est plus grand que 1 | ||
- | vrai | ||
- | 'mon_script' supprimé | ||
- | </file> | ||
- | |||
- | <note important> | ||
- | Attention : | ||
- | <code bash mon_script> | ||
- | #!/bin/bash | ||
- | var1=8 | ||
- | var2=7 | ||
- | if test "$e" -gt "$f" ; then | ||
- | echo " $var1 est plus grand que $var2 " | ||
- | fi | ||
- | printf \\n | ||
- | test 8 -gt 7 && echo "$var1 est plus grand que $var2" | ||
- | </code> | ||
- | |||
- | <code user> | ||
- | bash mon_script | ||
- | |||
- | rm -v mon_script | ||
- | </code> | ||
- | <file config retour de la commande> | ||
- | mon_script: ligne 4 : test: : nombre entier attendu comme expression | ||
- | |||
- | 8 est plus grand que 7 | ||
- | 'mon_script' supprimé | ||
- | </file> | ||
- | </note> | ||
- | =====Conclusion sur les opérateurs lexicographiques et les opérateurs de comparaison numérique===== | ||
- | ====Yep, plus de confusions ! ==== | ||
- | <note> | ||
- | Nous avons vu :\\ | ||
- | |||
- | * qu'il y a deux mécanismes pour effectuer des tests, la paire de crochets et la commande test; | ||
- | |||
- | * qu'à chaque mécanisme sa syntaxe : | ||
- | <code> | ||
- | $ test -f /etc/gaga | ||
- | </code> | ||
- | |||
- | Ou | ||
- | |||
- | <code> | ||
- | $ [ -f /etc/gaga ] | ||
- | </code> | ||
- | (Si le fichier /etc/gaga existait, //le code de retour// serait 0.\\ Voir la commande exit et son utilisation dans les scripts.) | ||
- | |||
- | * qu'il était possible de faire des tests avec commande test ou les crochets sur [[doc:programmation:shells:la-page-man-bash-ii-les-operateurs-lexicographiques#caracteres-de-comparaison-sur-les-chaines-de-caracteres|les chaînes de caractères]] ; et [[doc:programmation:shells:la-page-man-bash-ii-les-operateurs-lexicographiques#tests-sur-les-fichiers|les fichiers]]. | ||
- | |||
- | * que, pour des comparaisons sur [[doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique|les nombres]] on utilise : | ||
- | soit les doubles parenthèses avec les opérateurs booléens : | ||
- | <code> | ||
- | == != < > >= <= | ||
- | </code> | ||
- | soit les crochets (ou la commande "test") avec les opérateurs : | ||
- | <code> | ||
- | -eq -ne -gt -ge -lt -le | ||
- | </code> | ||
- | |||
- | * qu'on utilise exclusivement les opérateurs ''-eq'' ; ''-ne'' ; ''-gt'' ; ''-ge'' ; ''-lt'' ; ''-le'' sur les nombres mais pas sur les chaînes de caractères ; | ||
- | |||
- | * qu'enfin il ne faut pas confondre pas avec les opérateurs précédents, les options qu'on utilise exclusivement pour tester les fichiers :''-e'' ; ''-d''; ''-f'' ; ''-L'' ; ''-r'' ; ''-w'' ; ''-x'' ; $fichier1 ''-nt'' $fichier2 ; $fichier1 ''-ot'' $fichier2 | ||
- | |||
- | Plein d'exemples dans ce wiki en anglais : [[http://wiki.bash-hackers.org/commands/classictest]] | ||
- | </note> | ||
- | |||
- | :-D | ||
=====Pour aller plus loin : les opérateurs logiques.===== | =====Pour aller plus loin : les opérateurs logiques.===== |