Страница руководства Bash описывает использование ${!a}
для возврата содержимого переменной, имя которой является содержимым a
(уровень косвенности).
Я хотел бы знать, как вернуть все элементы в массиве, используя это, т.е.
a=(one two three)
echo ${a[*]}
возвращается
one two three
Я хотел бы для:
b=a
echo ${!b[*]}
вернуть то же самое. К сожалению, нет, но возвращается 0
.
Обновить
Учитывая ответы, я теперь понимаю, что мой пример был слишком прост, так как, конечно, что-то вроде:
b=("${a[@]}")
Достигнет именно то, что я сказал, что мне нужно.
Итак, вот что я пытался сделать:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Конечно, внимательное прочтение справочной страницы Bash показывает, что это не будет работать так, как ожидалось, потому что последняя строка просто возвращает индексы «массива» $_LIST
(а не массива вообще).
В любом случае, следующее должно сделать работу (как указано):
LIST=($(eval echo \${$_LIST[*]}))
или ... (маршрут, по которому я пошел, в конце концов)
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Предполагая, конечно, что элементы не содержат пробелов.
[@]
к указателю,_LIST="LIST_${whichone}[@]"
а затем используйтеLIST=("${!_LIST}")
для копирования массива. Рекомендуется использовать имена переменных в нижнем регистре, чтобы избежать конфликтов с переменными среды (все заглавные буквы).