Como imprimir o nome da variável junto com seu valor?

10

Existe alguma maneira de imprimir o nome da variável junto com seu valor?

j=jjj
k=kkk
l=lll

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

Saída esperada (cada variável em uma linha separada):

j = jjj 
k = kkk
l = lll

Alguém pode sugerir uma maneira de obter o resultado acima?

ejuser
fonte
Veja também: unix.stackexchange.com/questions/129084/…
sampablokuper

Respostas:

21

De maneira simples:

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

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

A saída:

j = jjj
k = kkk
l = lll

  • ${!i}- expansão / indireção da variável bash (obtém o valor do nome da variável mantido por $i)
RomanPerekhrest
fonte
2
Você pode fazer um {j,k,l}short com {j..l}também
:)
@ αғsнιη, é razoável para intervalos prolongados, enquanto houver apenas 3 itens - {j,k,l}seria suficiente
RomanPerekhrest
1
j k lseria o suficiente.
Stéphane Chazelas
6

Se você tiver o bash v4.4 ou posterior, poderá usar o ${VAR@A}operador de expansão Parameter.

Isso é discutido no manual do Bash, na seção 3.5.3 Expansão dos parâmetros do shell

Operador 'A'

A expansão é uma sequência na forma de uma instrução de atribuição ou comando de declaração que, se avaliada, recriará o parâmetro com seus atributos e valor.

Então, com isso, você pode fazer:

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

for i in {$j,$k,$l}; do 
    echo "${i@A}"
done

E seu resultado deve ser:

j='jjj'
k='kkk'
l='lll'
jesse_b
fonte
5

Ou em 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 )
% 
agitar
fonte
3
trabalha com Bash também
Steven Penny
2

Embora ${!i}seja uma solução mais limpa e rápida, para garantir a integridade, a referência indireta também pode ser obtida com o seguinte exemplo:

 foo=bar
 bar=baz
 $ echo $foo
 bar
 $ eval echo \$${foo}
 baz

Portanto:

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

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

Dá:

 j = jjj
 k = kkk
 l = lll

Referências:

Referências Indiretas

geedoubleya
fonte