Supposons que j'ai déclaré les variables suivantes:
$ var='$test'
$ test="my string"
Si j'imprime leur contenu, je vois ce qui suit:
$ echo $var
$test
$ echo $test
my string
Je voudrais trouver un moyen d'imprimer le contenu du contenu de $var
(qui est le contenu de $test
). J'ai donc essayé de faire ce qui suit:
$ echo $(echo $var)
$test
Mais ici le résultat est $test
et non "my string"
... Est-il possible d'imprimer le contenu du contenu des variables en utilisant bash?
bash
shell-script
variable
echo
variable-substitution
Rafael Muynarsk
la source
la source
ash
, oubash
, oucsh
, oudash
, ..., ouzsh
, ou POSIXsh
, ou avez-vous besoin de travailler sur différents systèmes?Réponses:
Vous pouvez accomplir cela en utilisant l'expansion de variable indirecte de bash (tant que vous pouvez laisser de côté
$
votre variable de référence):3.5.3 Extension des paramètres du shell
la source
Dans le cas où le nom de variable contenu dans
var
est préfixé,$
vous pouvez utilisereval
:Que se passe t-il ici:
$var
à la valeur$test
, produisant uneeval echo $test
commande;eval
évalue l'echo $test
expression et produit un résultat souhaité.Notez que l'utilisation
eval
en général peut être dangereuse (selon ce qui est stockévar
), alors préférez l'éviter. La fonctionnalité d'extension indirecte est meilleure pour votre cas (mais vous devez vous débarrasser de la$
connexion$test
).la source
eval
, ligne, vous avez besoin de deux couches de guillemets doubles:eval echo "\"$var\""
. Attention, cela ne fait rien sur les autres dangers d'utilisationeval
que vous avez mentionnés.Similaire à la réponse de Jesse_b , mais en utilisant une variable de référence de nom au lieu d'une indirection variable (nécessite
bash
4.3+):La variable de référence de nom
var
contient le nom de la variable à laquelle elle fait référence. Lorsque la variable est déréférencée en tant que$var
, la valeur de cette autre variable est renvoyée.bash
résout les références de nom de manière récursive:Pour être complet, l'utilisation d'un tableau associatif (dans la version
bash
4.0+) est également un moyen de résoudre ce problème, en fonction des exigences:Cela fournit un moyen plus flexible d'accéder à plus d'une valeur par une clé ou un nom qui peut être déterminé dynamiquement. Cela peut être préférable si vous souhaitez collecter toutes les valeurs d'une catégorie particulière dans un seul tableau, tout en étant en mesure d'y accéder par une clé (par exemple, les noms accessibles par ID ou les noms de chemin accessibles par objectif, etc.) car cela ne pollue pas l'espace de noms variable du script.
la source
Avec
zsh
:Avec n'importe quelle coque de type Bourne
Rappelez-vous que dans ces shells, les extensions de variables doivent être entre guillemets pour empêcher split + glob (
zsh
étant une exception) etecho
ne peuvent pas être utilisées pour des données arbitraires.Comme avec les deux
(e)
eteval
qu'il y a une évaluation de code shell, il est important que le contenu$var
reste sous votre contrôle, car sinon cela peut être une vulnérabilité d'injection de commande arbitraire (même avec les${!var}
approches).la source