-a- um NAMES-indizierte Arrays zu erstellen (falls unterstützt)

-a- um NAMES-indizierte Arrays zu erstellen (falls unterstützt)

Ich möchte das allgemeine Konzept der „variablen Attribute“ verstehen und hoffe, dass es mir hilft zu verstehenwas ist eine Deklaration in Bash.

Was ist ein Variablenattribut? Warum sollte jemand einer Variablen ein Attribut zuweisen wollen? Warum reicht es beim Arbeiten mit Variablen nicht aus, einfach eine Variable zu erstellen und sie bei der Ausführung zu erweitern?

Antwort1

Normalerweise ist eine Variable ein Ort, an dem ein Wert gespeichert wird. Sie weisen der Variablen einen Wert zu ( var="some value") und können diesen anschließend mit einer Variablenerweiterung abrufen (Schreiben "$var"entspricht dem Schreiben von "some value").

Es ist möglich, Variablen zu erstellen, die etwas Besonderes tun, wenn Sie ihnen einen Wert zuweisen oder in anderen Situationen, in denen die Shell auf Variablen zugreift. Ein Attribut einer Variablen ist eine Anmerkung, die die Shell neben dem Namen und dem Wert der Variablen speichert und die der Shell mitteilt, dieses besondere Verhalten anzuwenden.

Ein Beispiel

declare -i xteilt der Shell mit, dass xnur ganzzahlige Werte enthalten sein dürfen. Wenn Sie einer Variablen einen Wert zuweisen, nimmt die Shell normalerweise den String, der sich aus der Erweiterung der rechten Seite des Gleichheitszeichens ergibt, und speichert ihn als Wert der Variablen. Wenn die Variable jedoch das ganzzahlige Attribut hat, analysiert die Shell diesen String als arithmetischen Ausdruck und speichert das Ergebnis der Auswertung dieses Ausdrucks. Beispiel:

$ x=2+2; echo $x
2+2
$ declare -i x; x=2+2; echo $x
4
$ declare -i x; x=2+hello; echo $x
2
$ declare -i x; x=2+
bash: 2+: syntax error: operand expected (error token is "+")

(Die dritte Zeile wird auf 2 x=2+hellogesetzt , weil es sich um einen Variablennamen handelt, der nicht definiert ist, und nicht gesetzte Variablen werden standardmäßig stillschweigend als 0 interpretiert.)xhello

Mehr Beispiele

  • declare -l vardeklariert, dass varnur Kleinbuchstaben enthalten sein dürfen. Wenn die Shell den Wert der Variablen speichert, konvertiert sie alle Großbuchstaben in Kleinbuchstaben.
  • declare -u varführt die Konvertierung in die andere Richtung durch.
  • declare -r varmacht vares schreibgeschützt, was ebenfalls ein spezielles Zuweisungsverhalten darstellt: Es führt dazu, dass jede nachfolgende Zuweisung varfehlschlägt.
  • declare -x varbewirkt var, dass in die Umgebung exportiert wird. Bei diesem Attribut tritt das spezielle Verhalten auf, wenn bash einen externen Befehl ausführt: Externe Befehle sehen eine Umgebung, die die Variablen enthält, die die Shell zum Zeitpunkt der Ausführung des externen Befehls exportiert.

Antwort2

Aus help declare:

Options which set attributes:
    -a  to make NAMEs indexed arrays (if supported)
    -A  to make NAMEs associative arrays (if supported)
    -i  to make NAMEs have the `integer' attribute
    -l  to convert the value of each NAME to lower case on assignment
    -n  make NAME a reference to the variable named by its value
    -r  to make NAMEs readonly
    -t  to make NAMEs have the `trace' attribute
    -u  to convert the value of each NAME to upper case on assignment
    -x  to make NAMEs export

Hinweis: declarekann auch für Funktionen verwendet werden.

Jedes dieser Attribute hat eine oder mehrere Verwendungszwecke:


-a- um NAMES-indizierte Arrays zu erstellen (falls unterstützt)

Dies ist nicht unbedingt erforderlich, da das Festlegen eines Parameters als Array diesen automatisch als indiziertes Array deklariert. Dies könnte Ihren Code übersichtlicher und lesbarer machen.


-A- um NAMES zu assoziativen Arrays zu machen (falls unterstützt)

Soweit ich weiß, ist dies absolut notwendig, da der Versuch, ein assoziatives Array festzulegen, ohne es vorher als solches zu deklarieren, zu einem indizierten Array führt.

$ assoc=([foo]=bar)
$ declare -p assoc
declare -a assoc=([0]="bar")
$ unset assoc
$ declare -A assoc
$ assoc=([foo]=bar)
$ declare -p assoc
declare -A assoc=([foo]="bar" )

-i- um Namen das Attribut `integer' zu geben

Nützlich, wenn Sie sicherstellen möchten, dass Ihr Parameternurhält ganze Zahlen. Dadurch können Sie auch arithmetische Erweiterungen bei Zuweisungen durchführen.

$ declare -i a
$ a=foo
$ echo $a
0
$ a=1+1
$ echo $a
2

-l- um den Wert jedes NAMENS bei der Zuweisung in Kleinbuchstaben umzuwandeln

Stellt sicher, dass der Wert Ihrer Parameter immer klein geschrieben ist. Dies ist eine ziemlich coole Funktion, die ich nicht kannte und die ich wahrscheinlich in Zukunft verwenden werde. Sie macht eine komplexe Parametererweiterung oder die Verwendung eines separaten Dienstprogramms wie überflüssig.tr

$ declare -l foo=Bar
$ echo $foo
bar

-n- Machen Sie NAME zu einer Referenz auf die Variable, die durch ihren Wert benannt ist

Wie eine indirekte Referenz. Dadurch könnte die Verwendung von evalin vielen Skripten entfallen.

$ a=foo
$ declare -n b=a
$ echo $b
foo

-r- um Namen schreibgeschützt zu machen

Dies ist eine gute Funktion. Sie kann besonders nützlich für Shell-/Umgebungsvariablen sein, die Sie einmal festlegen und dann nicht mehr ändern möchten.

$ declare -r foo=bar
$ echo $foo
bar
$ foo=baz
-bash: foo: readonly variable

-t- um Namen das Attribut `trace' zu geben

Da bin ich mir nicht sicher. Ich glaube, das trifft nur auf Funktionen zu.


-u- um den Wert jedes NAMENS bei der Zuweisung in Großbuchstaben umzuwandeln

Ähnlich wie -l, aber entgegengesetzt

$ declare -u foo=bAr
$ echo $foo
BAR

-x- um NAMES exportieren zu lassen

Nur eine andere Möglichkeit, Variablen in die Umgebung zu exportieren.


verwandte Informationen