Я хочу написать скрипт для ссылки на несколько массивов из другого массива, который содержит имена переменных этих массивов.
Вот мой код до сих пор:
#!/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
Я хотел бы, чтобы выходные данные сканировали оба массива (из внешнего цикла for) и печатали соответствующие строки во внутреннем цикле for, который вызывает echo. Мой текущий вывод просто показывает мне:
array1
array2
Буду благодарен за любые указания по этому поводу. Спасибо!
bash
shell-script
chnppp
источник
источник
for b in "${array1[@]}" "${array2[@]}"; do ...; done
?${a[@]}
на${!a}
то, что вы хотите (я думаю).${!a[@]}
дает длину массиваa
.${!a}
просто дает мне первые элементы.Ответы:
Bash 4.3 и более поздние версии поддерживают «ссылки на имена» или namerefs (похожая концепция существует
ksh93
, но область действия раздражающе отличается ):Переменная
arr
является nameref, который действует как псевдоним для именованной переменной (переменная с именем$a
в этом примере).Без namerefs в более ранних версиях Bash одним из решений было бы создание нового массива, который содержал бы все элементы из других массивов:
... немного похоже на
array_names
массив в вопросе, но с содержимым всех массивов, а затем перебрать"${all[@]}"
.Также возможно использовать
eval
, но полученный код выглядит поразительно ужасно.См . Ответ Гленна Джекмана о вариации с переменной косвенностью (введено в его текущей форме с версией 2 Bash).
источник
@Kusalananda имеет лучший ответ для последних версий Bash. Для более ранних версий вы можете использовать косвенную переменную:
См. 4-й абзац https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion.
источник
Как вариант того, что было сказано:
Вместо этого доступ к элементам по индексу
источник