Генерация контента, хранящегося в динамической переменной в Shell Script

Генерация контента, хранящегося в динамической переменной в Shell Script

Я застрял с приведенным ниже кодом и буду очень признателен любой помощи:

Я пытаюсь присвоить содержимое динамически сгенерированной переменной другой переменной. Но вместо присвоения значения переменной я увидел, что присваивается имя переменной. Я пробовал (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}на самом деле не работает.

Видеть:

Связанный контент