Использование команды 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 во втором случае?

3 Solutions collect form web for “Использование команды eval дважды”

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

С точки зрения безопасности, это действительно плохая идея использовать 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 .

  • Как перемещать или копировать список файлов, на которые ссылается файл csv, в новую папку
  • Как получить имя столбца с определенной строкой?
  • проблема с тем, как недавно созданные пусковые установки гномов работают против пусковых установок, восстановленных после загрузки системы. (изменение названия для ясности)
  • .profile написан в сценарии оболочки - могу ли я вместо этого заставить мою систему понять, что я хочу, чтобы вместо этого выполнялся скрипт Python?
  • sed повторяет последнюю строку в потоке
  • Cronjob не выполняет сценарий оболочки, но когда я выполняю его автономно, он работает. Зачем?
  • C ++ system () в bash-скрипте с при выполнении по-разному
  • Как создать сценарий оболочки для обработки команд типа ls -l / somedir
  • Разрешение запрета Bash Разрешено и плохой переводчик
  • терминал предупреждает о закрытии при открытии в скрипте
  • Как я могу разобрать xml-файл с URL-адреса http без загрузки файла и распечатать нужную строку?
  • Linux и Unix - лучшая ОС в мире.