Cette question a déjà des réponses ici :
Commentaires
- stackoverflow.com/ a / 18668580/1032785
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é deksh) effectue une comparaison arithmétique.arg1etnum1font 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$arg1est010et$num1est4+5, le résultat sera faux (la commande((...))retournera avec un statut de sortie différent de zéro), car010est octal pour 8 et4+5est 9. -
(($arg1 >= $num1)): comme ci-dessus sauf que$arg1et$num1sont développés avant que toute lexpression arithmétique ne soit évaluée. Si$arg1était(2et$num1était2), la commande précédente aurait échoué car(2et2)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 exemplea=2+2; echo "$((3 * $a))"aveca=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,$arg1et$num1sont 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 utilisestrcoll()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érateursexpr) ouawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"sont les commandes standard pour effectuer une comparaison de chaînes en utilisantstrcoll().