Bash - переменные переменные [дубликаты]

This question already has an answer here:

Dynamic variable names in Bash 10 answers

У меня есть переменная$foo="something" и хотел бы использовать:

bar="foo"; echo $($bar)

чтобы получить "что-то" эхо.

 Dennis Williamson25 мая 2012 г., 17:56
Посмотри пожалуйстаBashFAQ/006, Кроме того, вы не должны пытаться использовать знак доллара в левой части задания.

Ответы на вопрос(4)

eval echo \"\$$bar\" сделал бы это.

 25 мая 2012 г., 17:58
 03 февр. 2017 г., 05:29
Преимущество этого решения заключается в совместимости с POSIX для оболочек, отличных от Bash (например, для облегченных сред, таких как встроенные системы или контейнеры Docker). И вы можете присвоить значение другой переменной следующим образом:sh var=$(eval echo \"\$$bar\")

как сделать то же самое для массивов. Хитрость заключается в том, что вы хотите, чтобы ваша переменная содержала символ «[@]», чтобы массив расширялся символом «!». Проверьте эту функцию для дампа переменных:

$ function dump_variables() {
    for var in "[email protected]"; do
        echo "$var=${!var}"
    done
}
$ STRING="Hello World"
$ ARRAY=("ab" "cd")
$ dump_variables STRING ARRAY ARRAY[@]

Это выводит:

STRING=Hello World
ARRAY=ab
ARRAY[@]=ab cd

Когда дано как разARRAYпервый элемент показан как то, что расширено!, ДаваяARRAY[@] формат, вы получите массив и все его значения расширены.

 28 авг. 2014 г., 15:20
@ dimo414 Да, получить ключи через косвенное обращение сложнее. Вы должны передать только имя, а затем выполнить расширение в методе:local -a 'keys=("${!'"$var"'[@]}")',indirection article on Bash Hackers уходит вглубь.
 28 авг. 2014 г., 07:33
Хороший момент по поводу обработки массивов. Любая идея, как получитьindices массива?manual указывает, что это обычно делается с${!ARRAY[@]}, который, кажется, конфликтует с синтаксисом косвенного косвенного обращения.

arr=( 'a' 'b' 'c' )
# construct a var assigning the string representation 
# of the variable (array) as its value:
var=arr[@]         
echo "${!var}"
Решение Вопроса

ных переменных.

foo="something"
bar="foo"
echo "${!bar}"
 25 мая 2012 г., 18:15
Гораздо лучше, чем мой ответ.
 06 сент. 2013 г., 08:00
вsh это говорит о плохой замене. Любая идея, как это сделать вsh?
 26 мая 2012 г., 00:28
@mkb я не знал eval :-)
 14 апр. 2014 г., 23:14
как это работает с массивами?
 15 апр. 2014 г., 01:23
@Edisonfoo1="something1" foo2="something2" bar[0]="foo1" bar[1]="foo2" echo ${!bar[0]} echo ${!bar[1]}

Ваш ответ на вопрос