Supondo que o valor de FOO
seja um nome de variável válido (digamos BAR
), eval \$$FOO
divida o valor de BAR
em palavras separadas, trate cada palavra como um padrão curinga e execute a primeira palavra do 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 oeval
interno é a cadeia de quatro caracteres $BAR
.
${${FOO}}
é um erro de sintaxe. Ele não faz uma "substituição dupla" porque não existe esse recurso em nenhum dos shells comuns (de qualquer maneira, não com esta sintaxe). No zsh, ${${FOO}}
é válido e é uma substituição dupla, mas se comporta de maneira diferente do que você gostaria: executa duas transformações sucessivas no valor deFOO
, sendo ambas a transformação de identidade, portanto, é apenas uma maneira elegante de escrever ${FOO}
.
Se você deseja tratar o valor de uma variável como uma variável, tenha cuidado ao citar as coisas corretamente. É muito mais fácil se você definir o resultado para uma variável:
eval "value=\${$FOO}"
l3=l2; eval eval eval echo \\\$\\$\$$l3
→53294
portanto, não exatamente modular.