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.