eval
é bom se você usá-lo corretamente:
Func1() {
eval "$1=\$str1"
}
É seguro, contanto que Func1
seja chamado apenas com os nomes das variáveis que você pretende que sejam passados.
Como sempre, você precisa citar suas variáveis. E aqui, $str1
não precisa ser expandido antes de ser passado para eval
.
Se Func1
pode ser passado a sequências arbitrárias que não estão sob o seu controle, então é aí que você obteria problemas com valores como reboot;foo
e precisaria sanitizá-lo como:
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"
}
A criação de uma lista completa de variáveis problemáticas é uma tarefa condenada.