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.arg1
etnum1
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
est010
et$num1
est4+5
, le résultat sera faux (la commande((...))
retournera avec un statut de sortie différent de zéro), car010
est octal pour 8 et4+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
était2)
, la commande précédente aurait échoué car(2
et2)
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,$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 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()
.