有没有办法在 bash 中使用变量值作为变量名?

时间:2021-06-26 17:10:02

标签: bash macos unix

我正在尝试解决一个非常奇怪的问题。我正在努力完成这样的事情,

# loaded ahead of time
silly1_cred="secret"
silly2_cred="password"

important_var="silly1" #known at run time
cred=`echo ${important_var}_cred` #now value of cred is silly1_cred

现在我希望能够做这样的事情:eval $cred 访问“秘密”值,但它得到错误命令未找到:silly1_cred

另外,如果这是不可能的,请让我,我搜索并得到 this stackoverflow question 作为建议,但它似乎没有解决我的问题。

From another question 我发现了一些似乎能准确回答我正在寻找的问题,但我没有得到预期的结果。

1 个答案:

答案 0 :(得分:0)

eval 有效,但它需要一个命令,而不仅仅是一个字符串。所以你可以做例如cred=$(eval "echo \"\$${important_var}_cred\"")。请注意,您需要一个文字 $ 以便将变量扩展为其值;我在扩展周围加上了文字双引号,因为您几乎总是应该在扩展周围加上双引号。

但是 eval is best avoided 因为它使您的代码特别容易受到注入攻击。

如果将变量名单独放到另一个变量中,可以使用${!var}语法,比eval更安全:

varname=${important_var}_cred
cred=${!varname}

请参阅 Bash 常见问题中的 this entry