Ich möchte ein Skript schreiben, um auf mehrere Arrays aus einem anderen Array zu verweisen, das die Variablennamen dieses Arrays enthält.
Hier ist mein Code bisher:
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in ${array_names[@]}
do
for b in ${a[@]}
do
echo $b
done
done
Ich möchte, dass die Ausgabe beide Arrays (von der äußeren for-Schleife) durchsucht und die entsprechenden Zeichenfolgen in der inneren for-Schleife druckt, die Echo aufruft. Meine aktuelle Ausgabe zeigt mir nur:
array1
array2
Ich wäre dankbar für Hinweise dazu. Vielen Dank!
bash
shell-script
chnppp
quelle
quelle
for b in "${array1[@]}" "${array2[@]}"; do ...; done
?${a[@]}
zu${!a}
das, was Sie wollen (glaube ich).${!a[@]}
gibt eine Länge des Arrays ana
.${!a}
gibt mir nur die ersten Elemente.Antworten:
Bash 4.3 und höher unterstützt "Namensreferenzen" oder Namensreferenzen (ein ähnliches Konzept gibt es in
ksh93
, aber der Umfang ist ärgerlich unterschiedlich ):Die Variable
arr
ist ein nameref, der wie ein Alias für die benannte Variable fungiert (die Variable mit dem Namen$a
in diesem Beispiel).Ohne namerefs besteht eine Lösung in früheren Bash-Versionen darin, ein neues Array zu erstellen, das alle Elemente aus den anderen Arrays enthält:
... ein bisschen wie das
array_names
Array in der Frage, aber mit dem Inhalt aller Arrays, und dann iterieren"${all[@]}"
.Es ist auch möglich zu verwenden
eval
, aber der resultierende Code sieht erstaunlich schrecklich aus.Siehe Antwort glenn Jackman für eine Variante mit variabler indirection (eingeführt in seiner jetzigen Form mit Bash Version 2).
quelle
@Kusalananda hat die beste Antwort für aktuelle Versionen von Bash. Für frühere Versionen können Sie eine indirekte Variable verwenden:
Siehe den 4. Absatz von https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
quelle
Als Variation dessen, was gesagt wurde:
Zugriff auf die Elemente stattdessen über den Index
quelle