Вопрос по bash – Bash - переменные переменные [дубликаты]

32

This question already has an answer here:

Dynamic variable names in Bash 10 answers

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

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

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

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

Ваш Ответ

4   ответа
5

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

Знать оsecurity implications of eval.
Преимущество этого решения заключается в совместимости с POSIX для оболочек, отличных от Bash (например, для облегченных сред, таких как встроенные системы или контейнеры Docker). И вы можете присвоить значение другой переменной следующим образом:sh var=$(eval echo \"\$$bar\")
1

arr=( 'a' 'b' 'c' )
# construct a var assigning the string representation 
# of the variable (array) as its value:
var=arr[@]         
echo "${!var}"
63

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

foo="something"
bar="foo"
echo "${!bar}"
как это работает с массивами?
Гораздо лучше, чем мой ответ.
вsh это говорит о плохой замене. Любая идея, как это сделать вsh?
@mkb я не знал eval :-)
@Edisonfoo1="something1" foo2="something2" bar[0]="foo1" bar[1]="foo2" echo ${!bar[0]} echo ${!bar[1]}
7

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

$ 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[@] формат, вы получите массив и все его значения расширены.

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

Похожие вопросы