Supongamos que el valor de FOO
es un nombre de variable válido (digamos BAR
), eval \$$FOO
divide el valor de BAR
en palabras separadas, trata cada palabra como un patrón comodín y ejecuta la primera palabra del resultado como un comando, pasando las otras palabras como argumentos. La barra invertida frente al dólar hace que sea tratado literalmente, por lo que el argumento pasó aeval
builtin es la cadena de cuatro caracteres $BAR
.
${${FOO}}
es un error de sintaxis No hace una "doble sustitución" porque no existe tal característica en ninguno de los shells comunes (de todos modos no con esta sintaxis). En zsh, ${${FOO}}
es válido y es una sustitución doble, pero se comporta de manera diferente a lo que desea: realiza dos transformaciones sucesivas en el valor deFOO
, ambas de las cuales son la transformación de identidad, por lo que es solo una forma elegante de escribir ${FOO}
.
Si desea tratar el valor de una variable como una variable, tenga cuidado de citar las cosas correctamente. Es mucho más fácil si establece el resultado en una variable:
eval "value=\${$FOO}"
l3=l2; eval eval eval echo \\\$\\$\$$l3
→53294
así que no es exactamente modular.