Dies erforderte viel Versuch und Irrtum, funktionierte aber schließlich.
Ich habe mich von Youness inspirieren lassen. Aber alle anderen Antworten haben bei meiner alten Bash nicht geholfen (suse11sp1 [3.2.51 (1) -release])
Die 'for'-Schleife hat sich geweigert, das indirekte Array zu erweitern. Stattdessen müssen Sie es vorab erweitern und damit ein weiteres Array mit Ihrem neuen Variablennamen erstellen. Mein Beispiel unten zeigt eine Doppelschleife, da dies meine beabsichtigte Verwendung ist.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
Ich benutze #, um "New_" aus dem ersten Array-Eintrag zu löschen und dann mit "things" zu verketten, um "FOOthings" zu erhalten. \ $ {} mit echo und eval, dann mache ihre Sache in der richtigen Reihenfolge, ohne Fehler zu werfen, die in ein neues $ () eingeschlossen und mit dem neuen Variablennamen versehen werden.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
UPDATE ##### 2018/06/07
Ich habe kürzlich einen weiteren Dreh zu diesem Thema entdeckt. Die erstellte Variable ist eigentlich kein Array, sondern eine durch Leerzeichen getrennte Zeichenfolge. Für die obige Aufgabe war dies in Ordnung, da "for" das Array nicht liest, es erweitert und dann durchlaufen wird, siehe Auszug unten:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Aber ich musste es dann als Array verwenden. Dazu musste ich noch einen Schritt ausführen. Ich habe wörtlich Code von Dennis Williamson genommen . Ich habe es getestet und es funktioniert gut.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
Das "IFS = ','" ist eine Variable, die Ihren Begrenzer enthält. "read" mit "-a" schneidet und führt den Stich zurück in die Array-Variable. Beachten Sie, dass dies keine Berücksichtigung von Anführungszeichen hat, aber es gibt einige Optionen beim Lesen , um dies zu verwalten, z. B. habe ich das Flag -r entfernt, das ich nicht benötigte. Daher habe ich diesen Zusatz jetzt in der Variablenerstellung kombiniert, sodass die Daten so behandelt und adressiert werden können, wie sie sollten.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done