langs
ist kein Array, sondern eine Zeichenfolge in Ihrem Code.
So machen Sie es zu einem Array und verwenden es:
langs=( EN GE )
dir_EN=/xx
dir_GE=/zz
dir_ml=()
for i in "${langs[@]}"; do
declare -n p="dir_$i"
dir_ml+=( "$p" )
done
printf 'dir_ml = "%s"\n' "${dir_ml[@]}"
In der obigen Schleife $i
werden die Werte EN
und GE
wiederum übernommen. Dies stellt auch einen Namen Referenzvariable p
. Wenn auf den Wert von p
zugegriffen wird, wird die Zeichenfolge, die der Variablen bei ihrer Deklaration zugewiesen wurde, als Variablenname interpretiert und der Wert dieser Variablen zurückgegeben.
Die Ausgabe der oben genannten wird sein
dir_ml = "/xx"
dir_ml = "/zz"
Um Namensreferenzen in verwenden zu können bash
, benötigen Sie bash
Version 4.3 oder höher.
Eine andere (interessante, aber minderwertige) Möglichkeit:
dir_EN=/xx
dir_GE=/zz
# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml
for i in "${!dir_@}"; do
dir_ml+=( "${!i}" )
done
printf 'dir_ml = "%s"\n' "${dir_ml[@]}"
Hier $i
werden die Werte der Variablennamen dir_EN
und der dir_GE
Reihe nach übernommen. Wir verwenden dann die Variablenindirektion mit ${!i}
, um den Wert dieser Variablen zu erhalten. Diese Variante benötigt das langs
Array nicht, sondern setzt voraus, dass keine andere Variable mit dem Namen dir_
-something bezeichnet wird (was als etwas fragil angesehen werden kann, da ein Benutzer Variablen mit solchen Namen leicht in die Skriptumgebung einfügen kann).
Die Ausgabe ist für diesen Code dieselbe wie für den obigen Code.
${!langs[@]}
generiert die Indizes des Arrays0
und1
. Das$
ist in arithmetischen Zusammenhängen nicht notwendig.