---
created: 2021-09-08T21:26:59 (UTC +03:00)
source: https://www.tecmint.com/use-heredoc-in-shell-scripting/
author: Ivan Yastrebov
---
# Как использовать Heredoc в сценариях оболочки
---
Здесь документ ( **Heredoc** ) - это литерал входного или файлового потока, который рассматривается как специальный блок кода. Этот блок кода будет передан команде для обработки. **Heredoc** берет свое начало в оболочках **UNIX** и может быть найден в [популярных оболочках Linux,](https://www.tecmint.com/different-types-of-linux-shells/ "Наиболее часто используемые оболочки с открытым исходным кодом для Linux") таких как sh, tcsh, ksh, bash, zsh, csh. Примечательно, что другие языки программирования, такие как Perl, Ruby, PHP, также поддерживают heredoc.
### Структура Хердока
**Heredoc** использует две угловые скобки, `(<<)`за которыми следует **символ-разделитель** . Тот же токен-разделитель будет использоваться для завершения блока кода. Все, что попадает в разделитель, считается блоком кода.
Посмотрите на пример ниже. Я перенаправляю блок кода команде [cat](https://www.tecmint.com/13-basic-cat-command-examples-in-linux/ "Примеры команд Cat") . Здесь разделитель установлен на « **БЛОК** » и заканчивается тем же « **БЛОК** ».
cat << **BLOCK** Привет, мир Сегодняшняя дата: $ (date +% F) Мой домашний каталог = $ {HOME} **BLOCK**
**ПРИМЕЧАНИЕ.** Для начала и завершения блока следует использовать один и тот же токен-разделитель.
### Создать многострочные комментарии
Если вы сейчас когда-нибудь пишете код на bash, возможно, вы знаете, что bash по умолчанию не поддерживает многострочные комментарии, такие как **C** или **Java** . Вы можете использовать **HereDoc,** чтобы преодолеть это.
[](https://freestar.com/?utm_campaign=branding&utm_medium=banner&utm_source=tecmint.com&utm_content=tecmint_incontent)
Это не встроенная функция bash, поддерживающая многострочные комментарии, это просто взлом. Если вы не перенаправляете **heredoc** на какую-либо команду, интерпретатор просто прочитает блок кода и ничего не выполнит.
<< **КОММЕНТАРИЙ** Это строка комментария 1 Это строка комментария 2 Это строка комментария 3 **КОММЕНТАРИЙ**
[](https://www.tecmint.com/wp-content/uploads/2021/03/Multiline-Comments.png)
Многострочные комментарии
### Обработка пустых пространств
По умолчанию **heredoc** не подавляет любые символы пробелов (табуляции, пробелы). Мы можем изменить это поведение, добавив `dash (-)`после `(<<)`и разделитель. Это подавит все пробелы табуляции, но пробелы не будут подавлены.
cat << - BLOCK В этой строке нет пробелов. В начале этой строки есть 2 пробела. В этой строке есть одна вкладка. В этой строке 2 вкладки. В этой строке 3 вкладки. БЛОКИРОВАТЬ
[](https://www.tecmint.com/wp-content/uploads/2021/03/Handling-Spaces.png)
Обработка мест
### Подстановка переменных и команд
Heredoc принимает подстановку переменных. Переменные могут быть пользовательскими переменными или переменными среды.
СЕГОДНЯ = $ (date +% F)
cat << BLOCK1 # Пользовательские переменные Сегодняшняя дата = $ {TODAY} # Переменные среды, которые я использую = $ {USER} Мой домашний каталог \= $ {HOME} Я использую $ {SHELL} как моя оболочка BLOCK1
Точно так же вы можете запускать любые команды внутри блока кода **heredoc** .
cat << BLOCK2
$(uname -a)
BLOCK2
[](https://www.tecmint.com/wp-content/uploads/2021/03/Variable-and-Command-Substitution.png)
Variable and Command Substitution
### Escaping Special Characters
There are several ways we can escape special characters. Either you can do it at the character level or doc level.
To escape individual special characters use a **backslash (\\)**.
cat << BLOCK4
$(uname -a)
BLOCK4
cat << BLOCK5
Today date is = ${TODAY}
BLOCK5
To escape all the special characters inside the block surround the delimiter with single quotes, double quotes, or prefix delimiter with a backslash.
cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1
cat << "BLOCK2"
I am running as = ${USER}
BLOCK2
cat << \\BLOCK3
I am running as = ${USER}
BLOCK3
[](https://www.tecmint.com/wp-content/uploads/2021/03/Escaping-Special-Characters.png)
Escaping Special Characters
Now that we know the structure of **heredoc** and how it works, let’s see a few examples. Two common areas where I use **heredoc** are [running a block of commands over SSH](https://www.tecmint.com/execute-commands-on-multiple-linux-servers-using-pssh/ "Pssh - выполнять команды на нескольких удаленных серверах Linux с помощью одного терминала") and passing SQL queries through **heredoc**.
In the below example, we are trying to execute a block of code in a remote server through SSH.
[](https://www.tecmint.com/wp-content/uploads/2021/03/Running-Commands-Over-SSH.png)
Running Commands Over SSH
In the below example I am passing a **select** statement to **psql** to connect to a database and run the query. This is an alternative way to run a query in **psql** inside bash script instead of using the `-f` flag to run **.sql** file.
#!/usr/bin/env bash
UNAME=postgres
DBNAME=testing
psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT \* FROM COUNTRIES
WHERE region\_id = 4;
BLOCK
[](https://www.tecmint.com/wp-content/uploads/2021/03/Running-SQL-QUERY.png)
Running SQL QUERY
That’s it for this article. There is a lot more you can do with **heredoc** compared to what we have shown in the examples. If you have any useful hack with **heredoc** please post it in the comment section so our readers could benefit from that.
## If You Appreciate What We Do Here On TecMint, You Should Consider:
TecMint - это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей доступны БЕСПЛАТНО для всех.
Если вам нравится то, что вы читаете, подумайте о том, чтобы купить нам кофе (или 2) в знак признательности.
[](https://www.buymeacoffee.com/tecmint)
**Мы благодарны за вашу бесконечную поддержку.**
###### tags: [heredoc bash,here doc example bash,use heredoc in shell script,learn shell scripting] by EasyQuest