Как я могу ссылаться на существующий массив 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[@]}
Другие вопросы по тегам