这就是我想要实现的目标:
功能:
Func1() {
$1="Hello World"
}
通话功能:
local var1
Func1 var1
echo $var1 (should echo Hello World)
我发现这个例子似乎有效,但我想使用 eval 不是一个好主意:
Func1() {
eval $1=$str1
}
这样做的正确方法是什么?
我来自 .Net,经常使用参数作为参考。例如,将一个值赋回参数,以便稍后使用。
在上面的例子中 var1 应该被分配“Hello World”
(我使用的是sh shell)
答案1
eval
如果你正确使用它就可以了:
Func1() {
eval "$1=\$str1"
}
只要Func1
仅使用您希望传递的变量名称进行调用,就是安全的。
与往常一样,您需要引用变量。和这里,$str1
在传递给 之前不需要扩展eval
。
如果Func1
可能传递不受您控制的任意字符串,那么您就会遇到类似值的问题reboot;foo
,并且需要像这样清理它:
Func1() {
case $1 in
"" |\
*[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]* |\
[0123456789]* |\
BASH* | LD_* | PATH | IFS | ENV | SHELLOPTS | PERL5LIB | PYTHON_PATH |...)
echo >&2 "Can't set that variable"
return 1
esac
eval "$1=\$str1"
}
列出完整的清单有问题的不过,变量是一项注定失败的任务。