Comment imprimer le nom de la variable avec sa valeur?

Puis-je imprimer le nom de la variable avec sa valeur?

j=jjj k=kkk l=lll for i in j k l do .... done 

Résultat attendu (chaque variable sur une ligne distincte):

j = jjj k = kkk l = lll 

Quelquun peut-il suggérer un moyen dobtenir le résultat ci-dessus?

Commentaires

Réponse

De manière simple:

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

La sortie:

j = jjj k = kkk l = lll 

  • ${!i} bash expansion / indirection de variable (récupère la valeur du nom de variable détenu par $i)

Commentaires

  • Vous pouvez rendre {j,k,l} court avec {j..l} également:)
  • @ αғsнιη, il ' est raisonnable pour des plages étendues, tant quil ny en a que 3 ems – {j,k,l} suffirait
  • j k l serait suffisant.

Réponse

Si vous avez bash v4.4 ou version ultérieure, vous pouvez utiliser ${VAR@A} Opérateur dexpansion de paramètres.

Ceci est discuté dans le manuel de Bash sous la section 3.5.3 Extension des paramètres du shell

« Un » Opérateur

Le développement est une chaîne sous la forme dune instruction daffectation ou de déclarer une commande qui, si évalué, recréera le paramètre avec ses attributs et sa valeur.

Vous pouvez donc faire ceci:

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" 

Answer

Ou dans zsh utilisez 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 ) % 

Commentaires

  • fonctionne également avec Bash

Réponse

Alors que ${!i} est une solution plus propre et plus rapide, par souci dexhaustivité, référence peut également être obtenue avec lexemple suivant:

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

Par conséquent :

 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 

Références:

Références indirectes

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *