環境変数への間接アクセス [複製]

環境変数への間接アクセス [複製]

bashスクリプトがあると仮定すると

ev=USER

evを使用して$ USERの環境変数の値を取得するには?

無邪気にこれを試してください:

echo ${"$"$ev}

これにより置換が不良になる可能性があります。

$USER値を返したいです。

答え1

間接拡張(「可変間接参照」とも呼ばれる)を使用すると、

ev=USER
printf '%s\n' "${!ev}"

bashこれは、(5.0)マニュアルの「パラメータ拡張」セクションで説明されています。

evまたは名前参照を作成する(bash4.3以上が必要)

declare -n ev=USER
printf '%s\n' "$ev"

bashこれは(5.0)のマニュアルに記載されていますが、今後「位置パラメータ」というセクションです。

答え2

場合についてのみ環境シェル変数とは異なり、変数を使用すると、ほとんどのシステムで次のものを使用できます。

printenv -- "$ev"

シェル変数の場合は、Bourneに似たシェルを使用して次のことができます。

eval 'printf "%s\n" "${'"$ev"}'}"'

または以下を使用してzsh

printf '%s\n' "${(P)ev}"

または以下を使用してbash

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

コンテンツが$evあなたの管理下にない場合、この3つの脆弱性はランダムコマンドインジェクションの脆弱性です。

答え3

$ev次の値を変更したら、コマンドを評価することもできます。

eval echo "$"$ev

この部分はこのように実行する"$"$evために解析します。$USERevalecho $USER

関連情報