Die Operanden der numerischen Vergleiche -eq
, -gt
, -lt
, -ge
, -le
und -ne
werden als arithmetischer Ausdrücke genommen. Mit einigen Einschränkungen müssen sie immer noch einzelne Shell-Wörter sein.
Das Verhalten von Variablennamen im arithmetischen Ausdruck wird in Shell Arithmetic beschrieben :
Shell-Variablen sind als Operanden zulässig. Die Parametererweiterung wird durchgeführt, bevor der Ausdruck ausgewertet wird. Innerhalb eines Ausdrucks können Shell-Variablen auch nach Namen referenziert werden, ohne die Parametererweiterungssyntax zu verwenden. Eine Shell-Variable, die null oder nicht gesetzt ist, wird zu 0 ausgewertet, wenn auf sie namentlich verwiesen wird, ohne die Parametererweiterungssyntax zu verwenden.
und auch:
Der Wert einer Variablen wird als arithmetischer Ausdruck ausgewertet, wenn auf sie verwiesen wird
Aber ich kann den Teil der Dokumentation nicht finden, in dem es heißt, dass die numerischen Vergleiche arithmetische Ausdrücke annehmen. Es wird weder in Conditional Constructs unter [[
noch in Bash Conditional Expressions beschrieben .
Aber experimentell scheint es wie oben gesagt zu funktionieren.
Also, so etwas funktioniert:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
auch dies (der Wert der Variablen wird ausgewertet):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Aber das tut es nicht. Es ist kein einzelnes Shell-Wort, wenn das [[ .. ]]
geparst wird. Daher liegt ein Syntaxfehler in der Bedingung vor:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
In anderen arithmetischen Kontexten muss der Ausdruck kein Leerzeichen enthalten. Dies wird ausgegeben 999
, da die Klammern den arithmetischen Ausdruck im Index eindeutig abgrenzen:
a[6]=999; echo ${a[1 + 2 + 3]}
Andererseits ist der =
Vergleich eine Musterübereinstimmung und beinhaltet weder Arithmetik noch die automatische Variablenerweiterung in einem arithmetischen Kontext (Bedingte Konstrukte):
Wenn die Operatoren ==
und !=
verwendet werden, wird die Zeichenfolge rechts neben dem Operator als Muster betrachtet und gemäß den im Abschnitt Mustervergleich beschriebenen Regeln abgeglichen, als ob die Option extglob shell aktiviert wäre. Der =
Operator ist identisch mit ==
.
Das ist also falsch, da die Zeichenfolgen offensichtlich unterschiedlich sind:
[[ "1 + 2 + 3" = 6 ]]
wie folgt, obwohl die numerischen Werte gleich sind:
[[ 6 = 06 ]]
und auch hier werden die Saiten ( x
und 6
) verglichen, sie sind unterschiedlich:
x=6
[[ x = 6 ]]
Dies würde jedoch die Variable erweitern, so dass dies zutrifft:
x=6
[[ $x = 6 ]]
x=1
folgen[[ x -gt 2]]
?