Gerando conteúdo armazenado sob uma variável dinâmica em Shell Script

Gerando conteúdo armazenado sob uma variável dinâmica em Shell Script

Estou preso com o código abaixo e qualquer ajuda seria muito apreciada:

Estou tentando atribuir conteúdo dentro de uma variável gerada dinamicamente para outra variável. Mas em vez de o valor da variável ser atribuído, pude ver que o nome da variável está sendo atribuído. Eu tentei (echo/eval/!) mas nada está funcionando. Alguém poderia me ajudar com a solução?

Objetivo: atribuir o valor 24 (salvo na variávelmsd_ext_len) paracontagem_finalvariável.

Declaração de Variável

iter_val=1

var_1="msd_ext"

msd_ext_len=24

Código:

eval "final_count"=\${var_${iter_val}}_len

Saída -->msd_ext_len

Resultado Esperado -->24

Se eu adicionar mais uma linha de código conforme mostrado abaixo junto com o código acima e obtiver a saída:

count_val=${!final_count}

Mas essas duas linhas de código podem ser agrupadas em uma única linha de código?

Responder1

Então, primeiro, toda vez que você fizer algo como ${var_${iter_val}}, ou seja, tentar anexar um número ao nome de uma variável, você deverá usar um array:

arr=(a b c)
arr[1]=x
i=1
echo "${arr[i]}"

Se você precisa ter algo indexado porcordasem vez disso, use um array associativo ( declare -A arraynameno Bash).

A combinação deles, digamos, ter propriedades distintas em alguns "objetos" em uma matriz, é mais difícil. Você poderia usar duas matrizes separadas e depois usar foo[i]and bar[i].

Se você ainda precisar apontar indiretamente para essas matrizes por nome, precisará de uma referência de nome.

foo=(a b c)
bar=(x y z)
declare -n arrname=foo
echo "${arrname[i]}"

Não consigo dizer pelo seu código qual deveria ser exatamente a sua estrutura de dados, por isso é difícil dar uma resposta apenas para esse cenário.


Tentando reescrever seu exemplo, você poderia fazer algo assim:

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

Isso ainda requer o uso de um array for varnames, já que a expansão aninhada ${var_$foo}realmente não funciona.

Ver:

informação relacionada