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

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?

Comentários

Resposta

De maneira simples:

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

O resultado:

j = jjj k = kkk l = lll 

  • ${!i} bash expansão / indireção da variável (obtém o valor do nome da variável mantido por $i)

Comentários

  • Você pode tornar {j,k,l} curto com {j..l} também:)
  • @ αғsнιη, é ' razoável para intervalos estendidos, contanto que haja apenas 3 it ems – {j,k,l} seria o suficiente
  • j k l seria o suficiente.

Resposta

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

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

“A” Operator

A expansão é uma string na forma de uma instrução de atribuição ou declara o comando que, se avaliado, irá 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" 

Resposta

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 ) % 

Comentários

  • também funciona com o Bash

Resposta

Embora ${!i} seja uma solução mais limpa e rápida, para integridade, o indireto a referência 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 

Gives:

 j = jjj k = kkk l = lll 

Referências:

Referências indiretas

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *