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 arrayname
en 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:
- ¿Bash proporciona soporte para el uso de punteros?
- la página Matrices en BashGuide(matrices asociativas en la parte inferior)