Решение заключается в использовании $'string'
, например:
$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World
Вот выдержка из страницы руководства Bash:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not
been present.
A double-quoted string preceded by a dollar sign ($"string") will cause
the string to be translated according to the current locale. If the
current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
STR=$"Hello\nWorld"
просто печатаетHello\nWorld
.H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
будет отображать «Hello» и «World» в отдельных строкахEcho настолько девяностых и настолько чреват опасностями, что его использование должно привести к дампам ядра не менее 4 ГБ. Серьезно, проблемы с эхо были причиной того, что процесс стандартизации Unix, наконец, изобрел
printf
утилиту, покончив со всеми проблемами.Итак, чтобы получить новую строку в строке:
Там! Нет SYSV против BSD эха безумия, все это аккуратно напечатано и полностью переносимая поддержка C escape-последовательностей. Все, пожалуйста, используйте
printf
сейчас и никогда не оглядывайся назад.источник
$'string'
еще чище.$'foo'
Синтаксис не действует синтаксис POSIX , как в 2013 г. Многих снарядов будут жаловаться.BAR=$(printf "hello\nworld\n")
не печатает завершающий \ n для меня$()
указывается POSIX как удаление последовательностей из одного или нескольких символов <newline> в конце подстановки .На основании других ответов я сделал
источник
Проблема не с оболочкой. Проблема на самом деле с самой
echo
командой и отсутствием двойных кавычек вокруг переменной интерполяции. Вы можете попробовать использовать,echo -e
но это не поддерживается на всех платформах, и одна из причинprintf
теперь рекомендуется для переносимости.Вы также можете попробовать вставить новую строку прямо в ваш скрипт оболочки (если вы пишете скрипт), чтобы он выглядел как ...
или эквивалентно
источник
Я нахожу
-e
флаг элегантным и прямымЕсли строка является выводом другой команды, я просто использую кавычки
источник
echo
.echo -e
известен своими проблемами переносимости. Сейчас ситуация на Диком Западе меньше, чем в pre-POSIX, но нет никаких оснований для этогоecho -e
. См. Также stackoverflow.com/questions/11530203/…Единственная простая альтернатива - ввести новую строку в переменной:
Да, это означает, что Enterнужно писать в коде, где это необходимо.
Есть несколько эквивалентов
new line
персонажа.Но все они требуют «интерпретации» каким-либо инструментом ( POSIX printf ):
И поэтому инструмент необходим для построения строки с новой строкой:
В некоторых оболочках последовательность $'представляет собой специальное расширение оболочки. Известно, что работает в ksh93, bash и zsh:
Конечно, возможны и более сложные решения:
Или
источник
Знак $ перед одинарными кавычками '... \ n ...' выглядит следующим образом, однако двойные кавычки не работают.
источник
Я не эксперт по Bash, но этот работал для меня:
Я нашел это проще для форматирования текстов.
источник
$NEWSTR
вecho "$NEWSTR"
здесь важныВ моей системе (Ubuntu 17.10) ваш пример работает так, как нужно, как при вводе из командной строки (в
sh
), так и при выполнении в видеsh
скрипта:Я думаю, что это отвечает на ваш вопрос: это просто работает. (Я не пытался выяснить детали , такие , как , в какой момент именно замены символа новой строки для
\n
происходит вsh
).Тем не менее, я заметил, что этот же скрипт будет работать по-разному при выполнении с
bash
иHello\nWorld
вместо этого будет распечатывать :Мне удалось получить желаемый результат
bash
следующим образом:Обратите внимание на двойные кавычки
$STR
. Это ведет себя одинаково, если сохранить и запустить какbash
скрипт.Следующее также дает желаемый результат:
источник
Те требовательные, которые нуждаются только в новой строке и презирают многострочный код, который ломает отступы, могут сделать:
Bash (и, вероятно, другие оболочки) сожирает все завершающие символы новой строки после подстановки команды, поэтому вам нужно завершить
printf
строку не символом новой строки и затем удалить ее. Это также может легко стать вкладчиком.источник
Я не был действительно счастлив ни с одним из вариантов здесь. Это то, что сработало для меня.
источник
str=$(printf '%s\n' "first line" "another line" "and another line")
(оболочка будет удобно (или нет) обрезать любые последние символы новой строки из подстановки команд). Несколько ответов здесь уже продвигаютсяprintf
в различных формах, поэтому я не уверен, что это добавляет какую-то ценность как отдельный ответ.printf '%s\n' "first line" \
(перевод строки, отступ)'second line'
и т. Д. См. Такжеprintf -v str
для присвоения переменной без порождения подоболочки.