Supondo que o valor de FOO
seja um nome de variável válido (digamos BAR
), eval \$$FOO
divide o valor de BAR
em palavras separadas, trata cada palavra como um padrão curinga e executa a primeira palavra de o resultado como um comando, passando as outras palavras como argumentos. A barra invertida na frente do dólar faz com que seja tratado literalmente, então o argumento passado para o eval
builtin é a string de quatro caracteres $BAR
.
${${FOO}}
é um erro de sintaxe. Não faz uma “substituição dupla” porque não existe tal recurso em nenhum dos shells comuns (não com esta sintaxe de qualquer maneira). Em zsh, ${${FOO}}
é válido e é uma substituição dupla, mas comporta-se diferentemente do que você gostaria: ele realiza duas transformações sucessivas no valor de FOO
, sendo que ambas são transformação de identidade, por isso é apenas uma maneira elegante de escrever ${FOO}
.
Se você quiser tratar o valor de uma variável como uma variável, tome cuidado para citá-las corretamente. É muito mais fácil se você definir o resultado para uma variável:
eval "value=\${$FOO}"