たとえば、変数があります。
env_name="GOPATH"
それでは、次の環境変数を取得したいと思いますGOPATH
。
echo $GOPATH
この問題をどのように$GOPATH
解決しますか$env_name
?
答え1
これを行うために、他のシェルには異なる構文があります。
では、bash
次を使用します。可変間接:
printf '%s\n' "${!env_name}"
ではakaをksh
使用します。nameref
typeset -n
nameref env_name=GOPATH
printf '%s\n' "$env_name"
では、zsh
次を使用します。P
パラメータ拡張フラグ:
print -rl -- ${(P)env_name}
他のシェルでは使用する必要があります評価する、変数の内容が安全かどうかわからない場合は、いくつかのセキュリティリスクがあります。
eval "echo \"\$$name_ref\""
答え2
eval
シェルのプロンプト拡張が間接参照を処理するようにすることで、この問題を回避できます。
PS1=\$$env_name sh -si </dev/null 2>&1
これにはいくつかの利点があります。特に拡張後のコマンドは実行しません。したがって、ここで唯一のリスクは、$env_name
コマンド置換が含まれる場合です。拡張される変数には、拡張が3回試行されず、2回だけ試行されるため、危険なしにコマンド置換のように見える可能性があるすべてを含めることができます。この方法で確認するのはとても簡単です。
PS1=$"${env_name##*[\'\(]*}" sh -si </dev/null 2>&1
POSIXを考えると、エクスポートされたsh
環境変数を印刷し続けるので、ランダムなコード実行の危険なしに非常に安全でなければなりません。(シェルが理解するタイプ)標準出力として。