web-dev-qa-db-fra.com

obtenir la variable d'environnement par nom de variable?

Par exemple, j'ai une variable:

env_name="GOPATH"

Maintenant, je veux obtenir la variable d'environnement GOPATH comme si ceci:

echo $GOPATH

Comment puis-je avoir $GOPATH par $env_name?

44
roger

Différents shells ont une syntaxe différente pour y parvenir.

Dans bash, vous utilisez indirection variable :

printf '%s\n' "${!env_name}"

Dans ksh, vous utilisez nameref aka typeset -n:

nameref env_name=GOPATH
printf '%s\n' "$env_name"

Dans zsh, vous utilisez Pindicateur d'extension de paramètre :

print -rl -- ${(P)env_name}

Dans d'autres Shell, vous devez utiliser eval , ce qui vous place sous de nombreuses implications en termes de sécurité si vous n'êtes pas sûr que le contenu des variables est sûr:

eval "echo \"\$$name_ref\""
48
cuonglm

Vous pouvez éviter eval si vous laissez l'expansion d'un Shell gérer l'inversion:

PS1=\$$env_name sh -si </dev/null 2>&1

Cela présente certains avantages - en particulier dans la mesure où l'expansion n'est pas suivie d'une exécution de commande. Et donc le seul danger ici est si $env_name contient une substitution de commande. La variable qu'il développe peut contenir tout ce qui pourrait ressembler à une substitution de commande sans danger car l'expansion n'est pas tentée trois fois - seulement deux fois. De cette façon, la validation est assez simple:

PS1=$"${env_name##*[\'\(]*}" sh -si </dev/null 2>&1

Étant donné un POSIX sh, cela devrait être très sûr sans aucun risque d'exécution de code arbitraire, tout en imprimant toutes les variables d'environnement exportées (du type qu'un Shell peut comprendre) à standard-out .

0
mikeserv