bash - bash 中的间接变量赋值

标签 bash eval variable-assignment quotes

似乎在 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"

请注意,declarebashtypeset 的同义词。 typeset 命令得到更广泛的支持(kshzsh 也使用它):

typeset "$var=$val"

bash 的现代版本中,应该使用 nameref。

declare -n var=x
x=$val

它比 eval 更安全,但仍不完美。

关于bash - bash 中的间接变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9938649/

相关文章:

linux - 如何查找当前登录终端的IP?

bash - 在 Bash 中找不到文件时如何使 cp 命令安静?

javascript - QML:不要使用 'eval' (M23)

node.js - 从包含的 eval 脚本访问 Nodejs main 的局部变量上下文

在 LightGBM 中使用 eval() 评估测试数据集

python - a[] 和 a[ :] when assigning values? 有什么区别

bash - 使用 shell 脚本查找特定文件类型的文件

regex - 如何在 AWK 中使用正则表达式作为字段分隔符?

c - 为指针的索引赋值

c++ - 您如何为变量分配另一个类的值?