Here-документ (HereDoc) - это участок кода, который действует как отдельный файл. HereDoc - это многострочная строка или файловый литерал для передачи входных потоков другим командам и программам.
HereDoc особенно полезны при перенаправлении сразу нескольких команд, что помогает сделать сценарии Bash более аккуратными и понятными. В этой статье вы узнаете об основах использования нотации HereDoc и некоторых типичных случаях ее применения.
Необходимые условия
- Доступ к командной строке/терминалу в качестве пользователя sudo.
- Текстовый редактор для написания сценариев Bash.
- Знание основных команд Linux.
Синтаксис Bash HereDoc
Синтаксис для написания HereDoc следующий:
1 2 3 4 5 | [КОМАНДА] <<[-] 'РАЗДЕЛИТЕЛЬ' Строка 1 Строка 2 ... РАЗДЕЛИТЕЛЬ |
Состоит из следующих элементов:
- КОМАНДА- необязательный. Работает для любой команды, которая принимает перенаправление.
- << - оператор перенаправления для пересылки HereDoc в КОМАНДУ.
- - это параметр для подавления табуляции.
- РАЗДЕЛИТЕЛЬ в первой строке определяет маркер разделителя HereDoc. Наиболее распространены END, EOT и EOF, но подойдет любое многосимвольное слово, которое не появится в теле документа. Опустите одинарные кавычки в первой строке, чтобы позволить расширение команд и переменных.
- РАЗДЕЛИТЕЛЬ в последней строке указывает на конец HereDoc. Используйте то же слово из первой строки без пробелов.
Сам HereDoc содержит любое количество строк со строками, переменными, командами и другими входными данными.
Примеры Bash HereDoc
В этом разделе показано, как использовать нотацию HereDoc в различных ситуациях. Наиболее распространенным примером является использование команды cat.
Многострочный ввод
Откройте терминал и введите следующий текст, нажимая Enter после каждой строки:
1 2 3 4 | cat << EOF Привет Мир EOF |
Расширение переменных
HereDoc допускает использование переменных и считывает их.
Чтобы увидеть, как это работает, создайте две переменные в терминале:
1 2 | var1="Привет" var2="Мир" |
Передайте HereDoc команде cat, чтобы вывести эти две переменные вместе с переменной окружения:
1 2 3 4 5 | cat << END $var1 $var2 $PWD END |
Все переменные расширяются, и их соответствующие значения выводятся на терминал.
Расширение команд
HereDocs допускает подстановку команд. Запустите следующий код в терминале строка за строкой, чтобы увидеть результаты:
1 2 3 4 | cat << EOF $(echo Привет) $(whoami) EOF |
Заключите каждую команду в $(), чтобы оценить утверждение и получить результаты. Если опустить $(), текст будет рассматриваться как строка.
Игнорирование расширения переменных и команд
Добавьте одинарные или двойные кавычки к первому разделителю, чтобы игнорировать расширение переменных и команд в HereDoc.
Например:
1 2 3 4 5 | cat << "EOF" $(echo Привет) $(whoami) $PWD EOF |
Добавление кавычек к разделителю рассматривает содержимое как литерал HereDoc.
Передача и перенаправление
Используйте конвейеризацию или перенаправление для передачи результатов команды другой команде. Например, создайте сценарий Bash и добавьте следующее содержимое для передачи команды:
1 2 3 4 5 | #!/bin/bash cat << EOF | base64 -d 0J/RgNC40LLQtdGCINCc0LjRgA== EOF |
В качестве альтернативы используйте нотацию перенаправления для достижения того же результата:
1 2 3 4 5 | #!/bin/bash (base64 -d) < cat << EOF 0J/RgNC40LLQtdGCINCc0LjRgA== EOF |
Запустите сценарий Bash, чтобы увидеть результаты.
В обоих случаях вывод команд cat и HereDoc направляется (или перенаправляется) в команду base64 -d. В результате сценарий декодирует сообщение из HereDoc.
Запись в файл
HereDoc позволяет писать многострочные документы с помощью одной команды.
Чтобы создать файл и сохранить содержимое HereDoc, используйте следующий формат:
1 2 3 4 | cat << EOF > hello_world.txt Привет Мир EOF |
Если документ не существует, команда создаст его. Для подтверждения проверьте содержимое файла:
1 | cat hello_world.txt |
В консоли отобразится содержимое файла.
Подавление табуляции
Добавьте тире (-) после перенаправления, чтобы подавить ведущие табуляции. Например, создайте и запустите следующий сценарий:
#!/bin/bash
1 2 3 4 | cat <<- EOF Привет Мир EOF |
Без подавления табуляции сообщение выводится на консоль с отступом. Добавление тире убирает отступ табуляции и выводит сообщение без пробелов.
Внутри утверждений и циклов
При работе с HereDoc внутри утверждений и циклов следует помнить о следующем поведении:
Код внутри утверждений и циклов отделяется отступом. Добавьте тире после оператора перенаправления, чтобы печатать сообщения из HereDoc без отступов.
Завершающий разделитель не может иметь пробелов или отступов перед собой.
Попробуйте следующий пример кода, чтобы увидеть, как использовать HereDoc внутри оператора if:
1 2 3 4 5 6 7 8 9 | #!/bin/bash if true; then cat <<- "END" Привет Мир END fi |
Тире гарантирует, что отступы не появятся при выполнении программы. Завершающий разделитель не имеет отступов, и добавление пробелов приводит к ошибке.
Многострочные комментарии
HereDoc с командой null (:) создает эффект блочных комментариев в сценариях Bash.
Например:
1 2 3 4 5 | #!/bin/bash : << 'END' Это комментарий END |
Использование нотации HereDoc в качестве блочного комментария является нетрадиционным. В целом, Bash не поддерживает блочное комментирование.
Эскейп-символы
Чтобы избежать интерпретации символов, добавьте обратную косую черту (\) перед символом:
1 2 3 | cat << EOF \$100 EOF |
В качестве альтернативы, можно полностью избежать интерпретации символов, экранируя разделитель:
1 2 3 | cat << \EOF $100 EOF |
Использование кавычек для разделителя в данном случае эквивалентно.
Функции
Добавьте параметры в функцию, передав информацию через HereDoc. Например, создайте функцию для чтения строк и добавления информации через HereDoc:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash readLines(){ read greeting read name } readLines << EOF Привет $USER EOF echo $greeting echo $name |
Функция сохраняет информацию, предоставленную HereDoc, в переменных.
HereDoc и SSH
HereDoc удобен для выполнения нескольких команд на удаленной машине. Передайте HereDoc в SSH-соединение для выполнения нескольких команд.
Например:
1 2 3 4 | ssh username@host << EOF echo "Локальный пользователь: $USER" echo "Удаленный пользователь: \$USER" EOF |
Команда выводит локального и удаленного пользователей на консоль.
HereDoc и SFTP
SFTP помогает безопасно передавать данные по протоколу SSH. Переадресуйте HereDoc для автоматического выполнения нескольких команд SFTP:
1 2 3 | sftp username@host << EOF put test.sh EOF |
Код загружает файл-образец на удаленную машину.
Заключение
Пройдя через примеры в этом руководстве, вы знаете, как использовать нотацию HereDoc в различных ситуациях. HereDoc помогает передавать сразу несколько команд в качестве входных данных для разных команд.