Was bedeutet ein Dollarzeichen gefolgt von einer eckigen Klammer […] in Bash?

34

Es scheint, dass $[expr]die arithmetische Expansion genauso ausgeführt wird $((expr)). Aber ich kann keine Erwähnung $[in der Bash-Anleitung finden. Dieser Befehl liefert keine Ergebnisse:

gunzip -c /usr/share/man/man1/bash.1.gz | grep -E '\$\['

Was ist dieser Operator und ist sein Verhalten überall standardisiert?

Meine Bash-Version: GNU Bash, Version 3.2.51 (1) -Release (x86_64-apple-darwin13)

AmadeusDrZaius
quelle
3
So beantworten Sie Ihre Frage zu einem Standard explizit : Die (veraltete) bashspezifische $[...]Syntax entspricht nicht dem Standard. Das $((...))(was von stammt ksh) ist POSIX-Standard.
Janis
2
Mit Ubuntu 11.04: man bash | grep -E '\$\['. Ausgabe: Das alte Format $ [Ausdruck] ist veraltet und wird in zukünftigen Versionen entfernt
Cyrus
man-seiten können dinge wie _t_h_i_s enthalten (die dann vom man-dienstprogramm so interpretiert werden, dass sie anders aussehen), sodass dein grep fehlschlagen kann, wenn das, was du suchst, wie folgt vermerkt wird
Olivier Dulac

Antworten:

19

Hier finden Sie alte Bash-Quellen . Insbesondere habe ich heruntergeladen bash-1.14.7.tar.gz . In der documentation/bash.txtfinden Sie:

Arithmetische Erweiterung

Die arithmetische Erweiterung ermöglicht die Auswertung eines arithmetischen Ausdrucks und die Substitution des Ergebnisses. Es gibt zwei Formate für die arithmetische Erweiterung:

     $[expression]

     $((expression))

Die Verweise auf $[gehen doc/bash.htmlaus dem bash-doc-2.0.tar.gz-Download und demNEWS Datei wird erwähnt:

Die $[...]arithmetische Expansionssyntax wird zugunsten von nicht mehr unterstützt $((...)).

$((...)) ist auch die Standardsyntax für eine arithmetische Erweiterung, wurde jedoch möglicherweise später als in der ursprünglichen Bash-Implementierung zum Standard hinzugefügt.

Scheint $[...]jedoch immer noch in Bash 5.0 zu funktionieren, sodass es nicht vollständig entfernt wird.

Digitales Trauma
quelle
27

In einem Thread auf der GNU-Bash-Mailingliste heißt es, dass die$[ Syntax um eine frühe Syntax handelte, die zugunsten von veraltet war $((, da letztere bereits von der Korn-Shell verwendet wurde.

Laut dieser Site enthielt das Handbuch für Bash 3.2.48 einen Verweis auf die $[Syntax. Vermutlich wurde dieser Verweis in 3.2.51 entfernt.

AmadeusDrZaius
quelle