Woher kommt die rekursive Variablenerweiterung in numerischen Bash / Shell-Kontexten?
Die POSIX-Spezifikation gibt bezüglichArithmetische Erweiterung Da
[i] Wenn die Shell-Variable x einen Wert enthält, der eine gültige Ganzzahlkonstante bildet, optional mit einem führenden Plus- oder Minuszeichen, dann die arithmetischen Erweiterungen "$ ((x))" und "$ (($ x))" soll den gleichen Wert zurückgeben.
Was ist eine vernünftige Abkürzung und räumt komplizierte Ausdrücke ziemlich gut auf.
bash (versions3.2.25(1)-release
von CentOS 5 und4.3.33(1)-release
von debian unstable) sowie ksh Version AJM 93t+ 2010-06-21
von CentOS 5) scheinen aber alle einen Schritt weiter zu gehen.
Sie alle scheinen rekursiv Variablen zu erweitern, die bei der arithmetischen Erweiterung auftreten (und numerische Kontexte in[[
ergibt sich aus der Verwendung der numerischen Operatoren.
Speziell
$ set -x
$ bar=5
+ bar=5
$ foo=bar
+ foo=bar
$ [ foo -gt 4 ]; echo $?
+ '[' foo -gt 4 ']'
-bash: [: foo: integer expression expected
+ echo 2
2
$ [[ foo -gt 4 ]]; echo $?
+ [[ foo -gt 4 ]]
+ echo 0
0
$ [[ foo -eq 0 ]]; echo $?
+ [[ foo -eq 0 ]]
+ echo 1
1
$ [[ foo -eq 5 ]]; echo $?
+ [[ foo -eq 5 ]]
+ echo 0
0
$ (( foo == bar )); echo $?
+ (( foo == bar ))
+ echo 0
0
$ (( foo == 1 )); echo $?
+ (( foo == 1 ))
+ echo 1
1
Woher kommt dieses Verhalten und warum sollte es jemals wünschenswert sein?
Es macht mit[[
anstelle von[
explizitwenige Sicher bei Verwendung mit numerischen Operatoren, da ungültige Werte und Schreibfehler von Skriptfehlern zu im Hintergrund gültigen (aber wahrscheinlich fehlerhaften) Tests führen.
Bearbeiten: Als Nebenfrage, wenn jemand weiß,wan Dieses "Feature" wurde zu bash / etc hinzugefügt. Das würde mich auch interessieren.