Вопрос по – Как воспроизвести многолинейные струны в оболочке Bourne [дубликат]

12

This question already has an answer here:

When to wrap quotes around a shell variable? 5 answers

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

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

echo -e $MY_STRING

Это выводит:

Hello, world! This Is A Multi lined String.

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

@ tripleee: просто хотел быть милым и никому не наступать. Я пойду на это. Jens
Йенс: Будь смелым, ты можешь сделать эти изменения самостоятельно (как я только что сделал). tripleee
На самом деле это вопрос оболочки Bourne (не специфичный для bash). Не могли бы вы редактировать название соответственно? Jens

Ваш Ответ

3   ответа
18

 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неecho):

cat <<"HERE"
foo
Bar
HERE

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

cat <<HERE
$MY_STRING
HERE

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

Круто, но не могли бы вы объяснить, почему, прежде чем я поставлю правильный ответ? РЕДАКТИРОВАТЬ: Ах хорошо, я понимаю сейчас. Я забыл, что Bash не передает строки, как другие языки сценариев Hubro
Обратите внимание на правки. Надеюсь это поможет.
2

Попробуй это :

echo  "$MY_STRING"
13

echo это так девяностых.Новый (POSIX) малыш на блоке естьprintf.

 

нет-e или SYSV против BSD эхо безумие и полный контроль над тем, что и где печатается, экранирование, как в C. Все, пожалуйста, начните использоватьprintf сейчас и никогда не оглядывайся назад.

+1, у printf гораздо удобнее форматирование

Похожие вопросы