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
- Relacionados: unix.stackexchange.com/questions/129084/…
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: