Generando contenido almacenado bajo una variable dinámica en Shell Script

Generando contenido almacenado bajo una variable dinámica en Shell Script

Estoy atascado con el siguiente código y cualquier ayuda sería muy apreciada:

Estoy intentando asignar contenidos dentro de una variable generada dinámicamente a otra variable. Pero en lugar de asignar el valor de la variable, pude ver que se asigna el nombre de la variable. Lo intenté (echo/eval/!) pero nada funciona. ¿Alguien podría ayudarme con la solución?

Objetivo: Asignar el valor 24 (guardado en la variablemsd_ext_len) arecuento_finalvariable.

Declaración de variables

iter_val=1

var_1="msd_ext"

msd_ext_len=24

Código:

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

Salida -->msd_ext_len

Salida esperada -->24

Si agrego una línea más de código como se muestra a continuación junto con el código anterior y obtengo el resultado:

count_val=${!final_count}

Pero, ¿se pueden combinar estas 2 líneas de código en una sola línea de código?

Respuesta1

Entonces, primero, cada vez que hagas algo como ${var_${iter_val}}, es decir, intentes agregar un número al nombre de una variable, deberías usar una matriz en su lugar:

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

Si necesita tener algo indexado porinstrumentos de cuerdaen su lugar, utilice una matriz asociativa ( declare -A arraynameen Bash).

La combinación de ellos, por ejemplo, tener propiedades distintas en algunos "objetos" en una matriz, es más difícil. Podrías usar dos matrices separadas y luego usar foo[i]y bar[i].

Si aún necesita señalar indirectamente esas matrices por su nombre, necesita una referencia de nombre.

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

No puedo decir a partir de su código cuál se supone que es exactamente su estructura de datos, por lo que es difícil dar una respuesta solo para ese escenario.


Al intentar reescribir su ejemplo, podría hacer algo como esto:

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

Eso todavía requiere el uso de una matriz for varnames, ya que la expansión anidada ${var_$foo}realmente no funciona.

Ver:

información relacionada