Intereting Posts
предоставить групповые разрешения конкретному устройству Как удалить этот неуправляемый каталог? Сортировка нескольких столбцов Как запланировать что-то запускать один раз с помощью anacron? добавить имя файла в текст в углу файла изображения Почему “ IFS = read` используется так часто, а не `IFS =; в то время как читать..`? Arch Linux: Должен ли я хранить службу dhcpd, если я использую connman? Отображение и обновление счетчика в bash Как я могу отменить команду 'sudo' перед вводом пароля? Добавление ZFS в предварительно установленный установщик Debian Сценарий оболочки выполняется по-разному на основе рабочего каталога. Запустить приложение в сеансе x-server от внешнего терминала? Использование sed для поиска и замены сложной строки (желательно с регулярным выражением) DNSSEC: как должны записываться записи DS и заканчиваться в родительской зоне? пользователи без полномочий root не могут отправлять почту из командной строки с помощью exim

Использование команды eval дважды

Предположим, что:

a=b; b=c; c=d 

Затем eval echo \$$a производит вывод:

 c 

Если мы хотим извлечь выход d используя только ввод a , я попробовал следующее:

(i) eval echo \$(eval echo \$$a) вызывает ошибку:

 syntax error near unexpected token '(' 

(ii) eval echo \$\(eval echo \$$a\) выдает результат:

 c 

Я не могу понять, почему побег, сокращающий скобу, избавился от ошибки.

Кроме того, может кто-нибудь объяснить, почему я не получил вывод как d во втором случае?

Во-первых, предостережение:

С точки зрения безопасности, это действительно плохая идея использовать eval в любом сценарии оболочки, если вы точно не знаете , что делаете. (И даже тогда есть практически нулевые экземпляры, где это на самом деле лучшее решение.) Как начинающий сценарий оболочки, просто забудьте, что eval даже существует.

Для дальнейшего ознакомления см. Команду Eval и проблемы безопасности .


Чтобы получить выход d , вы можете использовать:

 eval echo \$${!a} 

Или:

 eval eval echo \\\$\$$a 

Там, где вы ошибались, проходили мимо символов неэкранированных скобок для echo . Если им предшествует некорректный $ , это замена команды. Но если котировка $ а не скобки, это недействительный синтаксис оболочки.

Вложенные оценки – беспорядочная вещь.

Первый,

 eval echo \$\(eval echo \$$a\) 

заставляет интерпретатор оценивать следующее:

 echo $(eval echo $b) 

Интерполирование самой внутренней вложенной команды (т.е. $(eval echo $b) ) приводит к:

 echo c 

Это дает вам результат:

 c 

Если вы хотите, чтобы вложенные оценки были правильно оценены (и я настоятельно рекомендую вообще не использовать eval ), вы должны стать довольно странным. См. Другие ответы для примеров.

Вы можете получить ожидаемый вывод d со следующим:

 eval echo \$$(echo ${!a}) 

${!a} – расширение имени переменной bash, которое дает c с вашими значениями. См. Руководство по bash .