bash: подстановка переменных в строку с одинарными и двойными кавычками

Рейтинг: 0Ответов: 1Опубликовано: 27.04.2015

Пишу скрипт на bash. Скрипт получает откуда-то извне текстовые строки и подставляет их в заранее прописанный текст. Проблема в том, что текст может содержать и одинарные, и двойные кавычки.

Я знаю, что строку можно задавать двойными кавычками - тогда в неё можно включать переменные - и одинарными - тогда подстановка переменных не работает:

$ FOO=123
$ echo "aaa $FOO bbb"
aaa 123 bbb
$ echo 'aaa $FOO bbb'
aaa $FOO bbb

А как быть, если строка содержит оба вида кавычек, и надо чтобы в ней работала подстановка переменных?

Можно, конечно, экранировать кавычки внутри строки, но это неудобно - легко запутаться, что и где надо экранировать, а что и где - нет.

Ответы

▲ 1Принят

Для таких случаев есть специальный синтаксис объявления строки - HEREDOC. Вместо кавычек для определения строки используется последовательность << и произвольная комбинация букв сразу за ней, обозначающая начало строки, и эта же комбинация букв, но уже без <<, обозначающая её конец:

#!/usr/bin/env bash

NAME="John Doe"
RESPONDENT="author of this fine script"

cat <<EndOfMessage
Hi there, $NAME.
Greetings to you, '$NAME', from "$RESPONDENT".
EndOfMessage

Строка находится, в данном случае, между <<EndOfMessage и EndOfMessage. В строке можно использовать оба вида кавычек и $переменные. Строка может включать в себя переводы каретки (быть многострочной).

HEREDOC есть не только в bash, но и в других языках программирования, однако его синтаксис от языка к языку может немного различаться.