--- 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://a.pub.network/core/imgs/fslogo-green.svg)](https://freestar.com/?utm_campaign=branding&utm_medium=banner&utm_source=tecmint.com&utm_content=tecmint_incontent) Это не встроенная функция bash, поддерживающая многострочные комментарии, это просто взлом. Если вы не перенаправляете **heredoc** на какую-либо команду, интерпретатор просто прочитает блок кода и ничего не выполнит. << **КОММЕНТАРИЙ** Это строка комментария 1 Это строка комментария 2 Это строка комментария 3 **КОММЕНТАРИЙ** [![Multiline Comments](https://www.tecmint.com/wp-content/uploads/2021/03/Multiline-Comments.png)](https://www.tecmint.com/wp-content/uploads/2021/03/Multiline-Comments.png) Многострочные комментарии ### Обработка пустых пространств По умолчанию **heredoc** не подавляет любые символы пробелов (табуляции, пробелы). Мы можем изменить это поведение, добавив `dash (-)`после `(<<)`и разделитель. Это подавит все пробелы табуляции, но пробелы не будут подавлены. cat << - BLOCK В этой строке нет пробелов. В начале этой строки есть 2 пробела. В этой строке есть одна вкладка. В этой строке 2 вкладки. В этой строке 3 вкладки. БЛОКИРОВАТЬ [![Handling Spaces](https://www.tecmint.com/wp-content/uploads/2021/03/Handling-Spaces.png)](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 [![Variable and Command Substitution](https://www.tecmint.com/wp-content/uploads/2021/03/Variable-and-Command-Substitution.png)](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 [![Escaping Special Characters](https://www.tecmint.com/wp-content/uploads/2021/03/Escaping-Special-Characters.png)](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. [![Running Commands Over SSH](https://www.tecmint.com/wp-content/uploads/2021/03/Running-Commands-Over-SSH.png)](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 [![Running SQL QUERY](https://www.tecmint.com/wp-content/uploads/2021/03/Running-SQL-QUERY.png)](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.tecmint.com/wp-content/uploads/2015/01/coffee.png)](https://www.buymeacoffee.com/tecmint) **Мы благодарны за вашу бесконечную поддержку.** ###### tags: [heredoc bash,here doc example bash,use heredoc in shell script,learn shell scripting] by EasyQuest