Dies hängt davon ab, ob die entsprechende Variable bereits zuvor im aktuellen Bereich deklariert wurde (oberste Ebene, auch bekannt als globale oder aktuelle Funktion).
Wenn es im aktuellen Bereich nicht deklariert wurde (und beachten Sie, dass die Variable im Bereich der obersten Ebene möglicherweise durch Importieren aus der Umgebung deklariert (und zugewiesen) wurde), deklariert sie es (macht es lokal für die Funktion Wenn Sie sich im Funktionsumfang befinden, weisen Sie ihm einen Typ zu, initialisieren ihn jedoch nicht, auch nicht einer leeren Liste (wird declare -p a
angezeigt declare -a a
, nicht so, declare -a a=()
als hätten Sie ihn deklariert und / oder zugewiesen a=()
).
Wenn es bereits im aktuellen Bereich deklariert wurde (z. B. weil es im globalen Bereich als skalare Variable aus der Umgebung importiert wurde), declare -a a
würde versucht , es in ein Array zu konvertieren .
Wenn es zuvor ein Skalar war, wird es zu einem ([0]=value-of-the-variable)
Array. Wenn es bereits ein Array war, bleibt es unberührt. Wenn es sich um ein assoziatives Array handelt, schlägt dies mit einem cannot convert associative to indexed array
Fehler fehl .
Beachten Sie, dass declare a
ein Array oder Hash nicht in einen Skalar konvertiert wird. bash
wäre sowieso nicht in der Lage, einen Hash / Array in Skalar zu konvertieren. Sie können declare +aA a
einen Skalar erzwingen (dies würde mit einem Fehler fehlschlagen, wenn die Variable zuvor ein Hash / Array im aktuellen Bereich war).
In Ihrem Fall wurde die Variable wahrscheinlich noch nicht im aktuellen Bereich deklariert, sodass sie deklariert, aber nicht zugewiesen wurde. Dies erklärt, warum der Versuch, sie zu erweitern, unter fehlschlägt set -u
.
Diese Unterscheidung zwischen zwei deklarierten und zugewiesenen / gesetzten Zuständen einer Variablen ist nicht spezifisch für bash
. In POSIX sh
können Sie auch export
eine Variable erstellen oder erstellen, readonly
ohne einen Wert anzugeben.
$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set
Beachten Sie, dass unset
die Variable sowohl deaktiviert als auch nicht deklariert wird. In bash
, mksh
und yash
es kann die Variable aus einem äußeren Bereich wiederherstellen.
In zsh
, außer in der sh
Emulation, typeset
deklariert die Verwendung einer Variablen und setzt sie auf einen leeren Wert, wenn sie nicht bereits festgelegt wurde oder festgelegt wurde, sondern von einem anderen Typ (Skalar vs. Array vs. assoziatives Array).
declare -a P; Q=()
, danndeclare -p P Q
oderset | grep -w '^[PQ]'
zu bash Vorstellung von Ihren Variablen zu zeigen. Befriedigt Sie das oder suchen Sie etwas Tieferes?