¿Hay alguna forma de que pueda imprimir el nombre de la variable junto con su valor?
j=jjj k=kkk l=lll for i in j k l do .... done
Resultado esperado (cada variable en una línea separada):
j = jjj k = kkk l = lll
¿Alguien puede sugerir una forma de obtener el resultado anterior?
Comentarios
- Relacionado: unix.stackexchange.com/questions/129084/…
Responder
De forma sencilla:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
El resultado:
j = jjj k = kkk l = lll
-
${!i}
– bash expansión de variable / indirección (obtiene el valor del nombre de la variable que tiene$i
)
Comentarios
- Puede hacer
{j,k,l}
corto con{j..l}
también:) - @ αғsнιη, ' es razonable para rangos extendidos, siempre que solo haya 3 ems –
{j,k,l}
sería suficiente -
j k l
sería suficiente.
Respuesta
Si tiene bash v4.4 o posterior, puede usar ${VAR@A}
Operador de expansión de parámetros.
Esto se analiza en el manual de Bash en la sección 3.5.3 Expansión de parámetros de shell
«A» Operador
La expansión es una cadena en forma de instrucción de asignación o comando de declaración que, si evaluado, volverá a crear el parámetro con sus atributos y valor.
Entonces, con esto puedes hacer:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Y su resultado debería ser:
j="jjj" k="kkk" l="lll"
Respuesta
O en zsh
use declare -p
% j=jjj; k=kkk; l=(l l l) % for v in j k l; do declare -p $v; done typeset j=jjj typeset k=kkk typeset -a l=( l l l ) %
Comentarios
- también funciona con Bash
Answer
Si bien ${!i}
es una solución más limpia y rápida, para completar, la La referencia también se puede obtener con el siguiente ejemplo:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Por lo tanto :
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
Gives:
j = jjj k = kkk l = lll
Referencias: