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 arrayname
no 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:
- O bash fornece suporte para o uso de ponteiros?
- a página Arrays no BashGuide(matrizes associativas na parte inferior)