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 aangezeigt 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 awü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 arrayFehler fehl .
Beachten Sie, dass declare aein Array oder Hash nicht in einen Skalar konvertiert wird. bashwäre sowieso nicht in der Lage, einen Hash / Array in Skalar zu konvertieren. Sie können declare +aA aeinen 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 shkönnen Sie auch exporteine Variable erstellen oder erstellen, readonlyohne einen Wert anzugeben.
$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set
Beachten Sie, dass unsetdie Variable sowohl deaktiviert als auch nicht deklariert wird. In bash, mkshund yashes kann die Variable aus einem äußeren Bereich wiederherstellen.
In zsh, außer in der shEmulation, typesetdeklariert 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 Qoderset | grep -w '^[PQ]'zu bash Vorstellung von Ihren Variablen zu zeigen. Befriedigt Sie das oder suchen Sie etwas Tieferes?