Книга: Основы программирования в Linux
Встроенные документы
Разделы на этой странице:
Встроенные документы
Особый способ передачи из сценария командной оболочки входных данных команде — использование встроенного документа (here document). Такой документ позволяет команде выполняться так, как будто она читает данные из файла или с клавиатуры, в то время как на самом деле она получает их из сценария.
Встроенный документ начинается со служебных символов <<
, за которыми следует специальная символьная последовательность, повторяющаяся и в конце документа. Символы <<
обозначают в командной оболочке перенаправление данных, которое в данном случае заставляет вход команды превратиться во встроенный документ. Специальная последовательность символов действует как маркер, указывая оболочке, где завершается встроенный документ. Маркерная последовательность не должна включаться в строки, передаваемые команде, поэтому лучше всего сделать ее запоминающейся и четко выделяющейся.
Рассмотрим упражнение 2.19.
Упражнение 2.19. Применение встроенных документов
Простейший пример просто передает входные данные команде cat
.
#!/bin/sh
cat <<!FUNKY!
hello
this is a here
document
!FUNKY!
Этот пример выводит на экран следующие строки:
hello
this is a here
document
Встроенные документы могут показаться странным средством, но они очень полезны, т.к. позволяют запускать интерактивные программы, например редактор, и снабжать их каким-либо заранее определенным вводом. Но особенно часто они применяются при выводе из сценария больших порций текста, как вы уже видели, и при этом позволяют избавиться от необходимости применять команду echo
для каждой выводимой строки. Вы можете использовать восклицательные знаки (!
) с двух сторон от идентификатора документа во избежание путаницы.
Если вы хотите обработать несколько строк заранее определенным способом, можно применить в сценарии строчный редактор ed и передать ему команды из встроенного документа (упражнение 2.20).
Упражнение 2.20. Ещё одно применение встроенного документа
1. Начнем с файла, названного a_text_file и содержащего следующие строки:
That is line 1
That is line 2
That is line 3That is line 4
2. Вы можете отредактировать этот файл, совместно используя встроенный документ и редактор ed:
#!/bin/sh
ed a_text_file <<!FunkyStuff!
3
d
., $s/is/was/ w
q
!FunkyStuff!
exit 0
Если вы выполните этот сценарий, то увидите, что теперь файл содержит следующие строки:
That is line 1
That is line 2
That was line 4
Как это работает
Сценарий командной оболочки запускает редактор ed и передает ему команды, необходимые для перехода к третьей строке, удаления строки и затем замены ее содержимым текущей строки (поскольку строка 3 (line 3) была удалена, теперь текущая строка — последняя строка файла). Эти команды редактора ed берутся из строк сценария, формирующих встроенный документ, строк между маркерами !Funky Stuff!
.
Примечание
Обратите внимание на знак внутри встроенного документа, применяемый для защиты от подстановки, выполняемой командной оболочкой. Символ экранирует знак $
, поэтому оболочка знает, что не следует пытаться подставить вместо строки $s/is/was/
ее значение, которого у нее конечно же нет. Оболочка просто передает текст $
как $, который затем сможет интерпретировать редактор e
- Глава 12 Документы XSL-FO
- Глава 17. Встроенные документы
- Пример 17-5. Встроенные документы и подстановка параметров
- Пример 17-8. Встроенные документы и функции
- 2.3. Встроенные документы
- Пример 17-10. Блочный комментарий
- Пример 17-7. Передача пары файлов во входящий каталог на "Sunsite"
- Пример 17-1. dummyfile: Создание 2-х строчного файла-заготовки
- Часть 3. Углубленный материал
- Пример 17-9. "Анонимный" Встроенный Документ