Bash Heredoc

Bash Heredoc

17 Мая 2020 | Терминал

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

Bash Heredoc

В 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 и как использовать в своих сценариях оболочки.


    Комментарии

    Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.

Загрузка комментариев...