Comment imprimer le nom de la variable avec sa valeur?

10

Existe-t-il un moyen d'imprimer le nom de la variable avec sa valeur?

j=jjj
k=kkk
l=lll

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

Sortie attendue (chaque variable sur une ligne distincte):

j = jjj 
k = kkk
l = lll

Quelqu'un peut-il suggérer un moyen d'obtenir le résultat ci-dessus?

ejuser
la source

Réponses:

21

De manière simple:

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

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

Le résultat:

j = jjj
k = kkk
l = lll

  • ${!i}- expansion / indirection de la variable bash (obtient la valeur du nom de la variable détenue par $i)
RomanPerekhrest
la source
2
Vous pouvez faire {j,k,l}court avec {j..l}aussi
:)
@ αғsнιη, c'est raisonnable pour des plages étendues, tant qu'il n'y a que 3 articles - ce {j,k,l}serait suffisant
RomanPerekhrest
1
j k lserait suffisant.
Stéphane Chazelas
6

Si vous avez bash v4.4 ou une version ultérieure, vous pouvez utiliser l' ${VAR@A}opérateur d'expansion des paramètres.

Ceci est discuté dans le manuel Bash à la section 3.5.3 Expansion des paramètres du shell

Opérateur «A»

L'expansion est une chaîne sous la forme d'une instruction d'affectation ou d'une commande declare qui, si elle est évaluée, recréera le paramètre avec ses attributs et sa valeur.

Donc, avec cela, vous pouvez faire:

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

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

Et votre résultat devrait être:

j='jjj'
k='kkk'
l='lll'
jesse_b
la source
5

Ou en cours d' zshutilisationdeclare -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 )
% 
branler
la source
3
fonctionne aussi avec Bash
Steven Penny
2

Bien qu'il ${!i}s'agisse d'une solution plus propre et plus rapide, pour être complète, la référence indirecte peut également être obtenue avec l'exemple suivant:

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

Donc:

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

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

Donne:

 j = jjj
 k = kkk
 l = lll

Références:

Références indirectes

geedoubleya
la source