In Bash-Skripten:
erstellen wir eine Variable, indem wir sie einfach benennen:
abc=ok
oder wir können declare
declare abc=ok
verwenden, was ist der Unterschied?
und warum bietet bash so viele Möglichkeiten, eine Variable zu erstellen?
Kommentare
- Bei Verwendung in einer Funktion
declare
macht NAMEs lokal, wie mit dem Befehllocal
. Die Option-g
unterdrückt dieses Verhalten. Siehehelp declare
. -
declare
ermöglicht das Erstellen von assoziativen Arrays, Ganzzahlen und Lese- Nur Variablen. Außerdem werden die Argumente erweitert, sodass Dinge wiedeclare $name=1
möglich sind.
Antwort
Von help -m declare
:
NAME
declare
– Legen Sie Variablenwerte und Attribute fest.ÜBERSICHT
declare
[-aAfFgilnrtux
] [-p
] [name
[=value
] …]BESCHREIBUNG
Variablenwerte und Attribute festlegen.
Variablen deklarieren und gib ihnen Attribute. Wenn keine NAMEs angegeben sind, zeigen Sie die Attribute und Werte aller Variablen an.
Optionen:
-f
Aktion oder Anzeige auf Funktionsnamen und Definitionen beschränken
-F
beschränkt die Anzeige nur auf Funktionsnamen (plus Zeilennummer und Quelldatei beim Debuggen)
-g
Erstellen Sie globale Variablen, wenn Sie diese in einer Shell-Funktion verwenden. andernfalls ignoriert
-p
zeigt die Attribute und den Wert an von jedem NAME
Optionen, die Attribute festlegen:
-a
, um NAMEs-indizierte Arrays zu erstellen (falls unterstützt)
-A
, um NAMEs assoziative Arrays zu erstellen (falls unterstützt)
-i
, damit NAMEs das Attribut integer haben
-l
, um NAMEs bei Zuweisung in Kleinbuchstaben umzuwandeln
-n
Machen Sie NAME zu einem Verweis auf die Variable, die nach ihrem Wert benannt ist.
-r
, um NAMEs erneut zu erstellen Nur
-t
, damit NAMEs das trace attribute
-u
zum Konvertieren von NAMEs in Großbuchstaben bei Zuweisung
-x
, um NAMEs zu erstellen Exportieren
Verwenden von
+
anstelle von-
deaktiviert das angegebene AttributVariablen mit dem Integer-Attribut werden arithmetisch ausgewertet (siehe Befehl
let
), wenn der Variablen ein Wert zugewiesen wird.Wann In einer Funktion verwendet
declare
NAMEs lokal, wie mit dem Befehllocal
. Die Option-g
unterdrückt dieses Verhalten.Exit Status:
Gibt den Erfolg zurück, es sei denn, eine ungültige Option wird angegeben oder ein Fehler bei der Variablenzuweisung tritt auf.SIEHE AUCH
bash (1)
UMSETZUNG
GNU Bash, Version 4.3.11 (1) -Veröffentlichung (i686-PC-Linux-Gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Lizenz GPLv3 +: GNU GPL Version 3 oder später < http : //gnu.org/licenses/gpl.html >
Also declare
wird zum Festlegen von Variablenwerten und Attributen verwendet.
Lassen Sie mich die Verwendung von zwei zeigen Attribute mit einem sehr einfachen Beispiel:
$ # First Example: $ declare -r abc=ok $ echo $abc ok $ abc=not-ok bash: abc: readonly variable $ # Second Example: $ declare -i x=10 $ echo $x 10 $ x=ok $ echo $x 0 $ x=15 $ echo $x 15 $ x=15+5 $ echo $x 20
Aus dem obigen Beispiel sollten Sie die Verwendung von declare
Variable über normale Variable! Diese Art von declare
ation ist nützlich in Funktionen, Schleifen mit Skripten.
Besuchen Sie auch Typvariablen: deklarieren oder Satz
Kommentare
- Ja, die " und Attribute " ist der Punkt! Das ist der Unterschied.
- Großartig! Ich liebe Beispiele, die beste Art zu lehren / lernen. Vielen Dank!
- Sie müssen wissen, welche " Attribute " diese Antwort verstehen. Sie ' sind Eigenschaften der Variablen wie ' Ganzzahl ', ' Array ' oder ' schreibgeschützt '.
- Dies erklärt die Deklaration sehr gut, ignoriert jedoch völlig, was passiert, wenn Sie eine Variable einfach durch bash deklarieren.
Antwort
abc=ok
weist der Variablen abc
einen Wert zu. declare abc
deklariert eine Variable namens abc
. Die beiden können als declare abc=ok
kombiniert werden.
In bash müssen wie in anderen Shells String- und Array-Variablen nicht deklariert werden, daher declare
ist nicht erforderlich, es sei denn, Sie möchten Optionen übergeben, z declare -A abc
, um abc
zu einem assoziativen Array zu machen, oder declare -r
, um eine Variable schreibgeschützt zu machen. Innerhalb einer Funktion macht declare
jedoch einen Unterschied: Es bewirkt, dass die Variable lokal für die Funktion ist, was bedeutet, dass der Wert der Variablen außerhalb der Funktion (falls vorhanden) beibehalten wird . (Es sei denn, Sie verwenden declare -g
, wodurch die Variable nicht lokal wird. Dies ist nützlich, wenn Sie sie mit anderen Optionen kombinieren, z. B. declare -gA
, um eine globale Variable zu erstellen assoziatives Array in einer Funktion.) Beispiel:
f () { declare a a="a in f" b="b in f" echo "From f: a is $a" echo "From f: b is $b" } a="Initial a" b="Initial b" f echo "After f: a is $a" echo "After f: b is $b"
Ausgabe:
From f: a is a in f From f: b is b in f After f: a is Initial a After f: b is b in f
Ein anderes Was Sie mit dem eingebauten declare
tun können, ist
Das eingebaute declare
ist einzigartig für bash. Es ist stark inspiriert und sehr nah an kshs typeset
eingebaut, und bash bietet typeset
als Synonym für declare
aus Kompatibilitätsgründen. (Ich weiß nicht, warum Bash es nicht einfach typeset
genannt hat). Es gibt ein drittes Synonym, local
. Es gibt auch export
, was dasselbe ist wie declare -x
, ebenfalls aus Kompatibilitätsgründen (mit jeder Shell im Bourne-Stil).
Kommentare
- ja! Die ' und Option ' ist der Punkt. p.s. Wenn ich die Bash entwerfe, lasse ich das Verhalten von " deklarieren, dass " etwas in einem anderen Zustand tut. Das macht die Sache einfach.
- Schöne Antwort. Eine weitere Frage, mit der unter
export
,local
unddeclare
am besten kompatibel ist andere Shells? - @ 0xc0de
export
ist in allen Varianten vonsh
vorhanden.local
existiert nur in bash und zsh,declare
nur in bash.typeset
existiert in ksh, bash und zsh.