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