通过变量名获取环境变量?

通过变量名获取环境变量?

例如我有一个变量:

env_name="GOPATH"

现在我想获取环境变量GOPATH,就像这样:

echo $GOPATH

我该如何$GOPATH度过$env_name

答案1

不同的 shell 有不同的语法来实现这一点。

在 中bash,您使用变量间接:

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

在 中ksh,您使用nameref又名typeset -n

nameref env_name=GOPATH
printf '%s\n' "$env_name"

在 中zsh,您使用P 参数扩展标志:

print -rl -- ${(P)env_name}

在其他 shell 中,您必须使用评估,如果您不确定变量内容是否安全,这会给您带来许多安全隐患:

eval "echo \"\$$name_ref\""

答案2

eval如果让 shell 的提示扩展处理间接寻址,则可以避免:

PS1=\$$env_name sh -si </dev/null 2>&1

这有一些优点 - 特别是扩展后不执行命令。所以这里唯一的危险是如果$env_name包含命令替换。它扩展为的变量可以包含任何可能看起来像命令替换的内容,而不会产生危险,因为扩展不会尝试三次 - 仅两次。通过这种方式验证相当容易:

PS1=$"${env_name##*[\'\(]*}" sh -si </dev/null 2>&1

给定 POSIX sh,这应该是非常安全的,没有任意代码执行的风险,同时仍然打印任何导出的环境变量(shell 可以理解的类型)到标准输出。

相关内容