Це вимагало багатьох спроб та помилок, але врешті-решт спрацювало.
Я взяв трохи натхнення у Юнес. Але всі інші відповіді не допомогли моєму старому bash (suse11sp1 [3.2.51 (1) -release])
Цикл "для" відмовився розширювати непрямий масив, замість цього потрібно попередньо розгорнути його, використовуючи його для створення іншого масиву з новим ім'ям змінної. Мій приклад нижче показує подвійну петлю, оскільки це моє призначення.
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
Я використовую #, щоб видалити "New_" з першого запису масиву, потім з'єднавшись із "things", щоб отримати "FOOthings". \ $ {} за допомогою echo і eval, потім роблять їх у порядку, не викидаючи помилок, які загортаються в новий $ () і присвоюють нове ім'я змінної.
$ 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
ОНОВЛЕННЯ ##### 2018/06/07
Нещодавно я виявив ще одну спіну з цього питання. Створена змінна - це насправді не масив, а розділений пробілом рядок. Для вищезазначеного завдання це було нормально, оскільки "for" працює, він не читає масив, він розгортається, а потім прокручується, див. Витяг нижче:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Але мені тоді потрібно було використовувати його як масив. Для цього мені потрібно було виконати ще один крок. Я взяв код дослівно Деннісом Вільямсоном . Я перевірив це, і він працює чудово.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" - це змінна, що містить ваш роздільник. "read" з "-a" скорочує і передає жало назад у змінну масиву. Зауважте, це не поважає лапок, але для читання цим способом прочитано кілька варіантів , наприклад, я видалив прапор -r, який мені не потрібен. Тож я тепер поєднав це додаток у створенні змінної, яка дозволяє обробляти дані та звертатися як слід.
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