Zajęło to wiele prób i błędów, ale ostatecznie zadziałało.
Czerpałem inspirację z Youness. Ale wszystkie inne odpowiedzi nie pomogły w moim starym bashu (suse11sp1 [wydanie 3.2.51 (1)])
Pętla „for” odmówiła rozwinięcia tablicy pośredniej, zamiast tego należy ją wstępnie rozwinąć, użyć jej do utworzenia kolejnej tablicy z nową nazwą zmiennej. Mój przykład poniżej pokazuje podwójną pętlę, ponieważ jest to moje zamierzone zastosowanie.
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
Używam #, aby usunąć „New_” z pierwszego wpisu tablicy, a następnie połączyć się z „Things”, aby uzyskać „FOOthings”. \ $ {} z echo i eval, a następnie wykonaj swoje czynności bez zgłaszania błędów, które są zawinięte w nową $ () i przypisane nowej nazwie zmiennej.
$ 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
AKTUALIZACJA ##### 2018/06/07
Niedawno odkryłem jeszcze jedną kwestię dotyczącą tego problemu. Utworzona zmienna nie jest w rzeczywistości tablicą, ale ciągiem rozdzielanym spacjami. W przypadku powyższego zadania było to w porządku, ponieważ ze względu na sposób działania „for” nie odczytuje tablicy, jest rozszerzana, a następnie zapętlana, patrz wyciąg poniżej:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Ale potem musiałem użyć go jako tablicy. W tym celu musiałem wykonać jeszcze jeden krok. Wziąłem dosłownie kod Dennisa Williamsona . Przetestowałem to i działa dobrze.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
„IFS =”, ”to zmienna zawierająca ogranicznik. „czytaj” za pomocą „-a” odcina i podaje żądło z powrotem do zmiennej tablicowej. Uwaga, to nie ma szacunku dla cudzysłowie, ale istnieje kilka opcji w odczycie , aby poradzić sobie z tym, na przykład, że usunęliśmy flagi -r czego nie potrzebujesz. Więc połączyłem ten dodatek w tworzeniu zmiennych, co pozwala na przetwarzanie danych i adresowanie ich tak, jak powinno.
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