たとえば、変数があります。
env_name="GOPATH"
次のように、環境変数GOPATH
を取得します。
echo $GOPATH
どうすれば入手することができますか $GOPATH
沿って $env_name
?
シェルによって、これを実現するための構文が異なります。
bash
では、 変数の間接参照 を使用します。
printf '%s\n' "${!env_name}"
ksh
では、nameref
別名typeset -n
を使用します。
nameref env_name=GOPATH
printf '%s\n' "$env_name"
zsh
では、P
パラメーター展開フラグ を使用します。
print -rl -- ${(P)env_name}
他のシェルでは eval を使用する必要があります。これは、変数の内容が安全であるかどうかわからない場合に、多くのセキュリティ上の影響を受けます。
eval "echo \"\$$name_ref\""
シェルのプロンプト拡張で間接処理を行う場合は、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
を指定すると、エクスポートされた環境変数を出力しながら、任意のコード実行のリスクなしに十分安全である(シェルが理解できる種類の)を標準出力に出力する。