Bash Heredoc
Bash Heredoc
Bash Heredoc
При написании скриптов вы можете быть в ситуации , когда вам нужно передать многострочный блок текста или кода интерактивной команды, такие как tee , cat или sftp .

В Bash и других оболочках, таких как Zsh, документ Here (Heredoc) представляет собой тип перенаправления, который позволяет передавать в команду несколько строк ввода.
Синтаксис написания HereDoc принимает следующую форму:
[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
- Первая строка начинается с необязательной команды, за которой следует специальный оператор перенаправления
<<
и идентификатор-разделитель.- Вы можете использовать любую строку в качестве идентификатора-разделителя, чаще всего используются EOF или END.
- Если идентификатор разделителя не заключен в кавычки, оболочка подставит все переменные, команды и специальные символы перед передачей строк здесь документа в команду.
- Добавление знака минуса к оператору перенаправления
<<-
приведет к игнорированию всех начальных символов табуляции. Это позволяет использовать отступы при написании здесь документов в сценариях оболочки. Не допускаются начальные пробельные символы, только табуляция.
- Блок here-document может содержать строки, переменные, команды и любые другие типы ввода.
- Последняя строка заканчивается идентификатором-разделителем. Пробелы перед разделителем не допускаются.
Основные примеры Heredoc
В этом разделе мы рассмотрим некоторые основные примеры использования heredoc.
Heredoc чаще всего используется в сочетании с командой cat .
В следующем примере мы передаем две строки текста, содержащие переменную окружения и команду для cat
использования здесь документа.
cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Как видно из выходных данных ниже, переменные и выходные данные команды заменяются:
The current working directory is: /home/linuxize
You are logged in as: linuxize
Посмотрим, что будет, если мы заключим разделитель в одинарные или двойные кавычки.
cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Вы можете заметить, что когда в качестве разделителя указывается в кавычках, расширение параметров не выполняется, а подстановка команд выполняется оболочкой.
The current working directory is: $PWD
You are logged in as: $(whoami)
Если вы используете heredoc внутри оператора или цикла, используйте <<-
операцию перенаправления, которая позволяет сделать отступ в вашем коде.
if true; then
cat <<- EOF
Line with a leading tab.
EOF
fi
Line with a leading tab.
Вместо отображения вывода на экране вы можете перенаправить его в файл , используя >
, >>
оператор.
cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF
Если файл file.txt не существует, он будет создан. При использовании >
файл будет перезаписан, тогда >>
как файл будет добавлен в файл.
Ввод heredoc также может быть передан по конвейеру. В следующем примере sed
команда заменит все вхождения l
символа на e
:
cat <<'EOF' | sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored
Чтобы записать переданные данные в файл:
cat <<'EOF' | sed 's/l/e/g' > file.txt
Hello
World
EOF
Использование Heredoc с SSH
Использование Heredoc - это один из самых удобных и простых способов выполнения нескольких команд в удаленной системе через SSH .
При использовании разделителя без кавычек убедитесь, что вы экранировали все переменные, команды и специальные символы, иначе они будут интерполированы локально:
ssh -T user@host.com << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
The current local working directory is: /home/linuxize
The current remote working directory is: /home/user
Вы также можете настроить аутентификацию на основе ключей SSH и подключаться к серверам Linux без ввода пароля.
Вывод
Из этого руководства вы узнали, что heredoc
и как использовать в своих сценариях оболочки.