Atribuição variável indireta no bash

Parece que a maneira recomendada de fazer a configuração indireta de variáveis no bash é usareval:

var=x; val=foo
eval $var=$val
echo $x  # --> foo

O problema é o habitual comeval:

var=x; val=1

(e como é recomendado em muitos lugares, pergunto-me quantos scripts estão vulneráveis por causa disso ...)

De qualquer forma, a solução óbvia de usar aspas (escapadas) não funciona realmente:

var=x; val=1\"

O fato é que o bash possui referência variável indireta inserida (com${!foo}), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?

Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:

eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd eval $var=$val # bad output here

(e como é recomendado em muitos lugares, pergunto-me quantos scripts estão vulneráveis por causa disso ...)

De qualquer forma, a solução óbvia de usar aspas (escapadas) não funciona realmente:

var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\"  # fail with the above

O fato é que o bash possui referência variável indireta inserida (com${!foo}), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?

Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:

eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd\" eval $var=\"$val\" # fail with the above

O fato é que o bash possui referência variável indireta inserida (com${!foo}), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?

Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:

eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd eval $var=$val # bad output here

(e como é recomendado em muitos lugares, pergunto-me quantos scripts estão vulneráveis por causa disso ...)

De qualquer forma, a solução óbvia de usar aspas (escapadas) não funciona realmente:

var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\"  # fail with the above

O fato é que o bash possui referência variável indireta inserida (com${!foo}), mas não vejo nenhuma maneira de executar tarefas indiretas - existe alguma maneira sensata de fazer isso?

Para o registro, eu encontrei uma solução, mas isso não é algo que eu consideraria "saudável" ...:

eval "$var='"${val//\'/\'\"\'\"\'}"'"

questionAnswers(12)

yourAnswerToTheQuestion