web-dev-qa-db-ja.com

変数名で環境変数を取得しますか?

たとえば、変数があります。

env_name="GOPATH"

次のように、環境変数GOPATHを取得します。

echo $GOPATH

どうすれば入手することができますか $GOPATH 沿って $env_name

44
roger

シェルによって、これを実現するための構文が異なります。

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\""
48
cuonglm

シェルのプロンプト拡張で間接処理を行う場合は、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を指定すると、エクスポートされた環境変数を出力しながら、任意のコード実行のリスクなしに十分安全である(シェルが理解できる種類の)を標準出力に出力する。

0
mikeserv