似乎在 bash 中进行间接变量设置的推荐方法是使用 eval
:
var=x; val=foo
eval $var=$val
echo $x # --> foo
问题是 eval
的常见问题:
var=x; val=1$'\n'pwd
eval $var=$val # bad output here
(因为它在很多地方都被推荐,我想知道有多少脚本因为这个而容易受到攻击......)
在任何情况下,使用(转义)引号的明显解决方案都行不通:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
问题是 bash 已经内置了间接变量引用(使用 ${!foo}
),但我没有看到任何这样的间接赋值方式——有没有任何明智的方式做这个?
郑重声明,我确实找到了解决方案,但这不是我认为“理智”的事情......:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
最佳答案
一个稍微好一点的方法,避免使用 eval
可能带来的安全隐患,是
declare "$var=$val"
请注意,declare
是 bash
中 typeset
的同义词。 typeset
命令得到更广泛的支持(ksh
和 zsh
也使用它):
typeset "$var=$val"
在 bash
的现代版本中,应该使用 nameref。
declare -n var=x
x=$val
它比 eval
更安全,但仍不完美。
关于bash - bash 中的间接变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9938649/