Я застрял с приведенным ниже кодом и буду очень признателен любой помощи:
Я пытаюсь присвоить содержимое динамически сгенерированной переменной другой переменной. Но вместо присвоения значения переменной я увидел, что присваивается имя переменной. Я пробовал (echo/eval/!), но ничего не работает. Может кто-нибудь помочь мне с решением?
Цель: Присвоить значение 24 (сохраненное в переменнойmsd_ext_len) кfinal_countпеременная.
Декларация переменной
iter_val=1
var_1="msd_ext"
msd_ext_len=24
Код:
eval "final_count"=\${var_${iter_val}}_len
Вывод -->msd_ext_len
Ожидаемый результат -->24
Если я добавлю еще одну строку кода, как показано ниже, вместе с кодом выше, и получу вывод:
count_val=${!final_count}
Но можно ли объединить эти две строки кода в одну?
решение1
Итак, во-первых, каждый раз, когда вы делаете что-то вроде ${var_${iter_val}}
, например, пытаетесь присоединить число к имени переменной, вам следует использовать вместо этого массив:
arr=(a b c)
arr[1]=x
i=1
echo "${arr[i]}"
Если вам нужно что-то проиндексироватьструнывместо этого используйте ассоциативный массив ( declare -A arrayname
в Bash).
Комбинация этих двух, например, наличие различных свойств у некоторых "объектов" в массиве, сложнее. Вы можете использовать два отдельных массива, а затем использовать foo[i]
и bar[i]
.
Если вам все еще нужно косвенно указать на эти массивы по имени, вам нужна ссылка на имя.
foo=(a b c)
bar=(x y z)
declare -n arrname=foo
echo "${arrname[i]}"
Из вашего кода я не могу точно сказать, какой должна быть ваша структура данных, поэтому сложно дать ответ именно для этого сценария.
Если попытаться переписать ваш пример, можно сделать что-то вроде этого:
varnames=()
varnames[1]=msd_ext
varnum=1
msd_ext_len=24
declare -n srcvar="${varnames[varnum]}_len"
declare -n dstvar=final_count
dstvar=$srcvar
echo $final_count
Для этого все равно необходимо использовать массив varnames
, поскольку вложенное расширение ${var_$foo}
на самом деле не работает.
Видеть:
- Поддерживает ли bash использование указателей?
- страница Массивы на BashGuide(ассоциативные массивы внизу)