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

6

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?

    
por ejuser 11.10.2017 / 22:19

4 respostas

17

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 da variável bash / indirection (obtém o valor do nome da variável mantido por $i )
por 11.10.2017 / 22:23
6

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

Isso é discutido no manual do Bash, na seção 3.5.3 Expansão do Parâmetro do Shell

'A' Operator

The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.

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 o seu resultado deve ser:

j='jjj'
k='kkk'
l='lll'
    
por 11.10.2017 / 22:45
4

Ou em 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 )
% 
    
por 11.10.2017 / 23:20
2

Embora ${!i} seja uma solução mais limpa e rápida, para fins de 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

    
por 12.10.2017 / 17:36