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 x
teilt der Shell mit, dass x
nur 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+hello
gesetzt , weil es sich um einen Variablennamen handelt, der nicht definiert ist, und nicht gesetzte Variablen werden standardmäßig stillschweigend als 0 interpretiert.)x
hello
Mehr Beispiele
declare -l var
deklariert, dassvar
nur Kleinbuchstaben enthalten sein dürfen. Wenn die Shell den Wert der Variablen speichert, konvertiert sie alle Großbuchstaben in Kleinbuchstaben.declare -u var
führt die Konvertierung in die andere Richtung durch.declare -r var
machtvar
es schreibgeschützt, was ebenfalls ein spezielles Zuweisungsverhalten darstellt: Es führt dazu, dass jede nachfolgende Zuweisungvar
fehlschlägt.declare -x var
bewirktvar
, 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: declare
kann 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 eval
in 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.