Apenas certifique-se de que os argumentos passados para eval
não sejam provenientes de entradas externas ou que, se forem, você os tenha higienizado antes.
Como em, não faça:
n=0
....
n=((n + 1))
eval "var$n=$1"
$n
está sob $1
não é. Se $1
for foo;reboot
, por exemplo, o eval receberá o código var3=foo;reboot
para interpretar e que será reinicializado.
Uso:
eval "var$n=\"
Então, em vez disso, eval
receberá var3=$1
, o que é bom.
eval "$1=\"
Seria errado também. Você precisa garantir que o conteúdo de $1
seja apenas de um conjunto de valores aceitos (saneantes):
unset var1 foo bar
case $1 in
(var1 | foo | bar) eval "$1=\";;
(*) echo >&2 unexpected variable name; exit 1;;
esac
Observe que eval
não é o único comando que avalia o código arbitrário, há muitos outros como sh
, perl
, awk
, sed
, até read
, export
, typeset
, printf
, test
ou [
em algumas shells, você precisa ser igualmente cuidadoso com elas ao passar a entrada externa como argumentos.