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