Как я могу ссылаться на существующий массив bash, используя 2-ю переменную, содержащую имя массива?
Мои самые близкие наиболее полезные совпадения, когда я искал ответ перед публикацией:
Перебирать массив в оболочке, имя которой хранится в переменной
Как использовать имя аргумента / параметра в качестве переменной в скрипте bash
Как перебрать массив, используя косвенную ссылку?
Моя попытка с частичным успехом:
#!/bin/bash
declare -a large_furry_mammals
declare -a array_reference
# I tried both declaring array_reference as an array and
# not declaring it as an array. no change in behavior.
large_furry_mammals=(horse zebra gorilla)
size=large
category=mammals
tmp="${size}_furry_${category}"
eval array_reference='$'$tmp
echo tmp=$tmp
echo array_reference[0]=${array_reference[0]}
echo array_reference[1]=${array_reference[1]}
Выход
tmp=large_furry_mammals
array_reference[0]=horse
array_reference[1]=
ожидание
Я бы ожидал получить выходную зебру, когда я повторил array_reference[1]
,
... но мне не хватает тонкости...
Почему я не могу получить доступ к элементам массива индекса после индекса 0? Это говорит о том, что array_reference
на самом деле не рассматривается как массив.
Я не собираюсь делать копию массива. Я хочу сослаться (что будет) статический массив на основе переменной, указывающей на этот массив, т.е. ${size}_furry_${category}
-> large_furry_mammals
,
Я успешно справился с общей идеей, используя ссылки, которые я разместил, но только если это не массив. Когда это массив, он падает для меня.
2 ответа
Если у вас Bash 4.3 или новее, вы можете использовать namerefs:
large_furry_mammals=(horse zebra gorilla)
size=large
category=mammals
declare -n array_reference=${size}_furry_$category
printf '%s\n' "${array_reference[@]}"
с выходом
horse
zebra
gorilla
Это ссылка, поэтому изменения отражаются как в large_furry_mammals
а также array_reference
:
$ array_reference[0]='donkey'
$ large_furry_mammals[3]='llama'
$ printf '%s\n' "${array_reference[@]}"
donkey
zebra
gorilla
llama
$ printf '%s\n' "${large_furry_mammals[@]}"
donkey
zebra
gorilla
llama
declare -a large_furry_mammals
declare -a array_reference
large_furry_mammals=(horse zebra gorilla)
size=large
category=mammals
echo ${large_furry_mammals[@]}
tmp="${size}_furry_${category}"
array_reference=${tmp}"[1]"
eval ${array_reference}='bear'
echo tmp=$tmp
echo ${large_furry_mammals[@]}