答案1
只需确保传递给的参数eval
不是来自外部输入,或者如果是,您已经事先清理了它们。
就像,不要这样做:
n=0
....
n=$((n + 1))
eval "var$n=$1"
$n
在下面你的控制,内容$1
不是。例如,如果$1
是,eval 将收到要解释的代码,然后重新启动。foo;reboot
var3=foo;reboot
使用:
eval "var$n=\$1"
然后,相反,eval
会收到var3=$1
,这很好。
eval "$1=\$2"
也会错的。您需要确保 的内容$1
仅来自一组可接受的值(清理):
unset -v var1 foo bar
case $1 in
(var1 | foo | bar) eval "$1=\$2";;
(*) echo >&2 unexpected variable name; exit 1;;
esac
请注意,这eval
不是评估任意代码的唯一命令,还有很多其他命令,例如sh
、perl
、awk
、 、sed
、 、 、read
、 、export
、typeset
、 、printf
、test
或[
在某些 shell 中,在将外部输入作为参数传递时,您需要同样小心。