Это заняло много проб и ошибок, но в итоге сработало.
Я черпал вдохновение у Юнесса. Но все остальные ответы не помогли на моем старом bash (suse11sp1 [3.2.51 (1) -release])
Цикл 'for' отказывался расширять косвенный массив, вместо этого вам нужно предварительно развернуть его, используйте его для создания другого массива с вашим новым именем переменной. Мой пример ниже показывает двойной цикл, так как это мое предназначение.
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_» из первой записи массива, а затем объединить с «вещи», чтобы получить «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