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
)
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?
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'
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 )
%
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: