间接访问环境变量

间接访问环境变量

鉴于我有一个 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

如果只是关于环境变量,与 shell 变量相反,那么在大多数系统上,您可以使用:

printenv -- "$ev"

对于 shell 变量,使用任何类似 Bourne 的 shell,您可以执行以下操作:

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

或者与zsh

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

或者与bash

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

如果内容$ev不受您的控制,则这 3 个漏洞都是任意命令注入漏洞。

答案3

您还可以在$ev替换值 for 后评估该命令:

eval echo "$"$ev

该部分"$"$ev解析为$USER如此eval执行echo $USER

相关内容