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 $iwerden die Werte ENund GEwiederum übernommen. Dies stellt auch einen Namen Referenzvariable p. Wenn auf den Wert von pzugegriffen 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 bashVersion 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 $iwerden die Werte der Variablennamen dir_EN und der dir_GEReihe nach übernommen. Wir verwenden dann die Variablenindirektion mit ${!i}, um den Wert dieser Variablen zu erhalten. Diese Variante benötigt das langsArray 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.