似乎在 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//\'/\'\"\'\"\'}"'"
Bash 有一个扩展printf
将其结果保存到变量中:
printf -v "${VARNAME}" '%s' "${VALUE}"
这可以防止所有可能的逃逸问题。
如果您使用无效的标识符$VARNAME
,该命令将失败并返回状态码 2:
$ printf -v ';;;' '%s' foobar; echo $?
bash: printf: `;;;': not a valid identifier
2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)