间接访问环境变量

Pau*_*ulB 5 bash variable

鉴于我有一个 bash 脚本

ev=USER
Run Code Online (Sandbox Code Playgroud)

如何使用 ev 获取 $USER 的环境变量值?

尝试天真地做:

echo ${"$"$ev}
Run Code Online (Sandbox Code Playgroud)

这导致糟糕的替代。

我希望能取回 $USER 的任何价值。

Kus*_*nda 11

通过使用间接扩展(有时也称为“变量间接”),

ev=USER
printf '%s\n' "${!ev}"
Run Code Online (Sandbox Code Playgroud)

这在bash(5.0) 手册的“参数扩展”部分中有描述。

或者,通过进行ev名称引用(需要bash4.3+),

declare -n ev=USER
printf '%s\n' "$ev"
Run Code Online (Sandbox Code Playgroud)

这在bash(5.0) 手册中有所描述,就名为“位置参数”的部分之前


Sté*_*las 5

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

printenv -- "$ev"
Run Code Online (Sandbox Code Playgroud)

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

eval 'printf "%s\n" "${'"$ev"}'}"'
Run Code Online (Sandbox Code Playgroud)

或与zsh

printf '%s\n' "${(P)ev}"
Run Code Online (Sandbox Code Playgroud)

或与bash

printf '%s\n' "${!ev}"
Run Code Online (Sandbox Code Playgroud)

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