Предположим, что значение FOO
является допустимым именем переменной (скажем BAR
), eval \$$FOO
разбивает значение BAR
на отдельные слова, обрабатывает каждое слово как шаблон подстановочного знака и выполняет первое слово результата как команду, передавая другие слова в качестве аргументов. Обратная косая черта перед долларом делает его трактуемым буквально, поэтому аргумент, передаваемый eval
встроенному, представляет собой строку из четырех символов $BAR
.
${${FOO}}
это синтаксическая ошибка Он не выполняет «двойную замену», потому что такой функции нет ни в одной из общих оболочек (в любом случае, с этим синтаксисом). В zsh ${${FOO}}
он действителен и представляет собой двойную подстановку, но он ведет себя не так, как вам бы хотелось: он выполняет два последовательных преобразования значения FOO
, оба из которых являются преобразованием идентификаторов, так что это просто причудливый способ записи ${FOO}
.
Если вы хотите трактовать значение переменной как переменную, будьте осторожны с правильным заключением в кавычки. Намного проще, если вы установите результат в переменную:
eval "value=\${$FOO}"
l3=l2; eval eval eval echo \\\$\\$\$$l3
→53294
так что не совсем модульный.