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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage