鉴于我有一个 bash 脚本
ev=USER
如何使用 ev 获取 $USER 的环境变量值?
天真地尝试这样做:
echo ${"$"$ev}
这会导致不良的替代。
我希望能返回 $USER 的值。
答案1
通过使用间接扩展(有时也称为“变量间接”),
ev=USER
printf '%s\n' "${!ev}"
bash
这在(5.0) 手册中标题为“参数扩展”的部分中进行了描述。
或者,通过进行ev
名称引用(需要bash
4.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
。