Как эхо многострочные строки в оболочке Bourne

Я хочу создать несколько скриптов для заполнения некоторых шаблонов и вставки их в папку проекта. Я хочу использовать оболочку script для этого, и шаблоны очень маленькие, поэтому я хочу их встроить в оболочку script. Проблема в том, что echo, кажется, игнорирует разрывы строк в моей строке. Либо это, либо строка не содержит разрывов строк для начала. Вот пример:

MY_STRING="
Hello, world! This
Is
A
Multi lined
String."

echo -e $MY_STRING

Выводится:

Hello, world! This Is A Multi lined String.

Я предполагаю, что echo является виновником. Как я могу заставить его признать разрывы строк?

Ответ 1

Вам нужны двойные кавычки вокруг интерполяции переменных.

 echo -e "$MY_STRING"

Это слишком распространенная ошибка. Вы должны привыкнуть всегда ссылаться на строки, если вам не нужно разделить на разделенные пробелами маркеры или развернуть шаблоны.

Итак, чтобы быть явным, оболочка будет нормализовать пробельные символы, когда она анализирует вашу командную строку. Вы можете увидеть это, если вы напишете простую программу на C, которая выводит массив argv.

argv[0]='Hello,'
argv[1]='world!'
argv[2]='This'
argv[3]='Is'
argv[4]='A'
argv[5]='Multi'
argv[6]='lined'
argv[7]='String.'

В отличие от цитирования, вся строка находится в argv[0], символах новой строки и всех.

Для чего стоит, также рассмотрите здесь документы (с cat, not echo):

cat <<"HERE"
foo
Bar
HERE

Вы также можете интерполировать переменную в документе здесь.

cat <<HERE
$MY_STRING
HERE

... хотя в данном конкретном случае это вряд ли то, что вы хотите.

Ответ 2

echo - это девяностые годы. Новый (POSIX) парень на блоке printf.

 printf '%s\n' "$MY_STRING"

Нет -e или SYSV vs BSD echo madness и полный контроль над тем, что печатается там, где и как широко, escape-последовательности, как в C. Все, пожалуйста, начните использовать printf сейчас и никогда не оглядываться назад.

Ответ 3

Попробуйте следующее:

echo  "$MY_STRING"