変数名で環境変数を取得しますか? [コピー]

変数名で環境変数を取得しますか? [コピー]

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

env_name="GOPATH"

それでは、次の環境変数を取得したいと思いますGOPATH

echo $GOPATH

この問題をどのように$GOPATH解決しますか$env_name

答え1

これを行うために、他のシェルには異なる構文があります。

では、bash次を使用します。可変間接:

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

ではakaをksh使用します。namereftypeset -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環境変数を印刷し続けるので、ランダムなコード実行の危険なしに非常に安全でなければなりません。(シェルが理解するタイプ)標準出力として。

関連情報