Les opérandes des comparaisons numériques -eq
, -gt
, -lt
, -ge
, -le
et -ne
sont considérés comme des expressions arithmétiques. Avec une certaine limitation, ils doivent toujours être des mots à coque unique.
Le comportement des noms de variables dans l'expression arithmétique est décrit dans Shell Arithmetic :
Les variables shell sont autorisées comme opérandes; l'expansion des paramètres est effectuée avant l'évaluation de l'expression. Dans une expression, les variables shell peuvent également être référencées par leur nom sans utiliser la syntaxe d'extension des paramètres. Une variable shell nulle ou non définie est évaluée à 0 lorsqu'elle est référencée par son nom sans utiliser la syntaxe d'extension de paramètre.
et aussi:
La valeur d'une variable est évaluée comme une expression arithmétique lorsqu'elle est référencée
Mais je ne trouve pas réellement la partie de la documentation où il est dit que les comparaisons numériques prennent des expressions arithmétiques. Il n'est pas décrit dans Constructions conditionnelles sous [[
, ni dans Bash Conditional Expressions .
Mais, par expérience, cela semble fonctionner comme dit ci-dessus.
Donc, des trucs comme ça fonctionnent:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
cela aussi (la valeur de la variable est évaluée):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Mais ce n'est pas le cas; ce n'est pas un seul mot shell quand le [[ .. ]]
est analysé, donc il y a une erreur de syntaxe dans le conditionnel:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
Dans d'autres contextes arithmétiques, il n'est pas nécessaire que l'expression soit sans espace. Cela s'affiche 999
, car les crochets délimitent sans ambiguïté l'expression arithmétique dans l'index:
a[6]=999; echo ${a[1 + 2 + 3]}
D'un autre côté, la =
comparaison est une correspondance de modèle , et n'implique pas d'arithmétique, ni l'expansion automatique de variable effectuée dans un contexte arithmétique (constructions conditionnelles):
Lorsque les opérateurs ==
et !=
sont utilisés, la chaîne à droite de l'opérateur est considérée comme un modèle et mise en correspondance selon les règles décrites ci-dessous dans Correspondance de modèles, comme si l'option shell extglob était activée. L' =
opérateur est identique à ==
.
C'est donc faux puisque les chaînes sont évidemment différentes:
[[ "1 + 2 + 3" = 6 ]]
comme c'est le cas, même si les valeurs numériques sont les mêmes:
[[ 6 = 06 ]]
et ici aussi, les chaînes ( x
et 6
) sont comparées, elles sont différentes:
x=6
[[ x = 6 ]]
Cela étendrait la variable, cependant, c'est donc vrai:
x=6
[[ $x = 6 ]]
x=1
suiviez par[[ x -gt 2]]
?