¿Cómo imprimir el nombre de la variable junto con su valor?

10

¿Hay alguna forma de imprimir el nombre de la variable junto con su valor?

j=jjj
k=kkk
l=lll

for i in j k l
do
    ....
done

Salida esperada (cada variable en una línea separada):

j = jjj 
k = kkk
l = lll

¿Alguien puede sugerir una forma de obtener el resultado anterior?

ejuser
fuente
Relacionado: unix.stackexchange.com/questions/129084/…
sampablokuper

Respuestas:

21

De manera simple:

j="jjj"
k="kkk"
l="lll"

for i in {j,k,l}; do echo "$i = ${!i}"; done

La salida:

j = jjj
k = kkk
l = lll

  • ${!i}- expansión / indirección de la variable bash (obtiene el valor del nombre de la variable en poder de $i)
RomanPerekhrest
fuente
2
Usted puede hacer {j,k,l}corto con {j..l}también:)
αғsнιη
@ αғsнιη, es razonable para rangos extendidos, siempre y cuando solo haya 3 artículos, {j,k,l}sería suficiente
RomanPerekhrest
1
j k lseria suficiente.
Stéphane Chazelas
6

Si tiene bash v4.4 o posterior, puede usar el ${VAR@A}operador de expansión de parámetros.

Esto se trata en el manual de Bash en la sección 3.5.3 Expansión de parámetros de Shell

Operador 'A'

La expansión es una cadena en forma de una instrucción de asignación o comando de declaración que, si se evalúa, recreará 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'
jesse_b
fuente
5

O en zshusodeclare -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 )
% 
thrig
fuente
3
también funciona con Bash
Steven Penny
2

Si bien ${!i}es una solución más limpia y rápida, para completar, la referencia indirecta 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

Da:

 j = jjj
 k = kkk
 l = lll

Referencias

Referencias indirectas

geedoubleya
fuente