Die Bash-Manpage beschreibt die Verwendung von ${!a}
, um den Inhalt der Variablen zurückzugeben, deren Name der Inhalt von ist a
(eine Indirektionsebene).
Ich möchte wissen, wie alle Elemente in einem Array mit diesem zurückgegeben werden können, d. H.
a=(one two three)
echo ${a[*]}
kehrt zurück
one two three
Ich möchte für:
b=a
echo ${!b[*]}
das gleiche zurückzugeben. Leider nicht, sondern kehrt 0
stattdessen zurück.
Aktualisieren
Angesichts der Antworten stelle ich jetzt fest, dass mein Beispiel zu einfach war, da natürlich so etwas wie:
b=("${a[@]}")
Wird genau das erreichen, was ich gesagt habe.
Also, hier ist was ich versucht habe zu tun:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Das sorgfältige Lesen der Bash-Manpage zeigt natürlich, dass dies nicht wie erwartet funktioniert, da die letzte Zeile einfach die Indizes des "Arrays" zurückgibt $_LIST
(überhaupt kein Array).
In jedem Fall sollte Folgendes die Arbeit erledigen (wie bereits erwähnt):
LIST=($(eval echo \${$_LIST[*]}))
oder ... (der Weg, den ich schließlich gegangen bin):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Vorausgesetzt natürlich, dass Elemente keine Leerzeichen enthalten.
[@]
dem Zeiger hinzu_LIST="LIST_${whichone}[@]"
undLIST=("${!_LIST}")
kopieren Sie das Array mit. Es ist eine gute Idee, Variablennamen in Kleinbuchstaben zu verwenden, um Konflikte mit Umgebungsvariablen (Großbuchstaben) zu vermeiden.