似乎在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//\'/\'\"\'\"\'}"'"
declare
和typeset
不同(在bash 4.2之前只能将变量声明为本地变量),使用此解决方案时,变量不会被声明为本地变量。问题已解决! - Law29'%s'
是字面值。这让我感到困惑,因为在给出的例子中没有看到'%s'
...我猜测这个例子之所以能够运行,是因为它不仅是字面值,而且还似乎是可选的,适用于间接赋值变量的用例。 - Cognitiaclaeves