Comment utiliser les opérateurs de comparaison dans bash? [dupliquer]

Cette question a déjà des réponses ici :

Commentaires

Answer

Ces opérateurs sont utilisés, par exemple, dans (( ... )) et $(( ... )) ( évaluation arithmétique et développement arithmétique respectivement):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

Et aussi avec let. Ce qui suit est équivalent à ce qui précède:

if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

Voir la section intitulée « ÉVALUATION ARITHMÉTIQUE » dans le manuel de Bash.

Répondez

Dans bash spécifiquement:

  • ((arg1 >= num1)) (hérité de ksh) effectue une comparaison arithmétique. arg1 et num1 font ici référence aux variables shell du même nom. Chaque variable est interprétée comme une expansion arithmétique et le résultat est remplacé. Ici, si $arg1 est 010 et $num1 est 4+5, le résultat sera faux (la commande ((...)) retournera avec un statut de sortie différent de zéro), car 010 est octal pour 8 et 4+5 est 9.
  • (($arg1 >= $num1)): comme ci-dessus sauf que $arg1 et $num1 sont développés avant que toute lexpression arithmétique ne soit évaluée. Si $arg1 était (2 et $num1 était 2), la commande précédente aurait échoué car (2 et 2) ne sont pas des expressions valides en soi. Mais ici, cela réussirait car (2 >= 2) serait lexpression arithmétique évaluée. Généralement, dans les expressions arithmétiques, il « vaut mieux laisser le $ dehors. Comparez par exemple a=2+2; echo "$((3 * $a))" avec a=2+2; echo "$((3 * a))".
  • let "..." (également de ksh). Identique à ((...)) sauf quil « s analysé comme une commande normale, est moins lisible, est aussi peu portable et vous devez faire plus attention aux guillemets.
  • [ "$arg1" -ge "$num1" ]. Cest standard et portable. Seules les constantes décimales sont prises en charge. [ 010 -ge 9 ] est identique à [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Également de ksh mais avec des différences majeures. Cette fois, $arg1 et $num1 sont pris en compte sous forme dexpressions arithmétiques et pas seulement de constantes décimales. [[ 010 -ge 9 ]] renvoie à nouveau false.
  • [[ $arg1 < $num1 ]]. Comparaison de chaînes. Cela utilise strcoll() pour comparer des chaînes, donc en utilisant lalgorithme de tri dans les paramètres régionaux. Notez que si < et > utilise lalgorithme de tri, = / == fait une comparaison octet à octet, il peut donc y avoir des paires de chaînes pour lesquelles tous les éléments <, > et = / == renvoie false. <= et >= ne sont pas pris en charge.
  • [ "$arg1" "<" "$num1" ]. Non standard. Idem que ci-dessus mais en utilisant la commande [. < doit être entre guillemets pour ne pas être considéré comme un opérateur de redirection.
  • expr " $arg1" "<=" " $num1" > /dev/null (notez le espaces pour forcer la comparaison lexicale et éviter les problèmes avec des chaînes ressemblant à des opérateurs expr) ou awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" sont les commandes standard pour effectuer une comparaison de chaînes en utilisant strcoll().

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *