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
?
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 P
indicateur 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\""
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 .