Echo newline в Bash печатает буквально\n

В Bash, попробовал следующее:

echo -e "hello\nworld"

Но он не печатает новую строку, только \n. Как я могу сделать печать новой строки?

Я использую Ubuntu 11.04.

Ответ 1

Вместо printf можно использовать

printf "hello\nworld\n"

printf имеет более последовательное поведение, чем echo. Поведение echo сильно варьируется между разными версиями.

Ответ 2

Вы уверены, что находитесь в bash? Работает для меня всеми тремя способами:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world

Ответ 3

echo $'hello\nworld'

печатает

hello
world

$'' строки используют ANSI C Quoting:

Слова вида $'string' рассматриваются специально. Слово расширяется до string, при этом символы с обратным слэшем-экранированием заменяются в соответствии со стандартом ANSI C.

Ответ 4

Вы всегда можете сделать echo "".

например.

echo "Hello"
echo ""
echo "World"

Ответ 5

В случайном случае, когда кто-то обнаруживает, что они бьют головой о стену, пытаясь понять, почему сотрудник script не будет печатать новые строки, обратите внимание на это →

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

Как и в приведенном выше примере, фактический запуск метода сам может быть обернут в эхо, которое заменяет любые эхо-сигналы, которые могут быть в самом методе. Очевидно, я окунал это для краткости, это было не так просто заметить!

Затем вы можете сообщить своим товарищам, что лучший способ выполнения функций будет таким:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

Ответ 6

Попробуйте

echo -e "hello\nworld"
hello
world

работал для меня в нано-редакторе.

Со страницы руководства:

-e включить интерпретацию обратной косой черты

Ответ 7

Это работает для меня в Raspbian,

echo -e "hello\\nworld"

Ответ 8

POSIX 7 на эхо

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e не определен, а обратные -e определены реализацией:

Если первый операнд - -n, или если любой из операндов содержит символ <backslash>, результаты определяются реализацией.

если у вас нет дополнительного расширения XSI.

Поэтому я рекомендую вместо этого использовать printf, что хорошо указано:

операнд формата должен использоваться в качестве строки формата, описанной в нотации формата файла XBD [...]

обозначение формата файла:

\n <newline> Переместите позицию печати в начало следующей строки.

Также имейте в виду, что Ubuntu 15.10 и большинство дистрибутивов реализуют echo как:

  • встроенный Bash: help echo
  • автономный исполняемый файл: which echo

что может привести к некоторой путанице.

Ответ 9

str='hello\nworld'
$ echo | sed "i$str"
hello
world

Ответ 10

Это работает для меня в CentOS:

echo -e ""hello\nworld""

Ответ 11

Вы также можете сделать:

echo "hello
world"

Это работает как внутри скрипта, так и из командной строки.
В командной строке нажмите Shift + Enter, чтобы сделать разрывы строк внутри строки.

Это работает для меня на моем MacOS и Ubuntu 18.04

Ответ 12

Еще одна запись здесь для тех, кто не помог ни с одним из этих решений, и должен получить возвращаемое значение из своей функции:

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

Только этот трюк работал в Linux, с которым я работал с этим bash:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

Надеюсь, что это поможет кому-то с подобной проблемой.

Ответ 13

Мой script:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

Вывод:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

На моем bash script я злился, пока я только что пробовал:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

Просто нажмите Enter, где вы хотите вставить этот прыжок. Вывод:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:

Ответ 14

Просто наберите

echo

чтобы получить новую линию

Ответ 15

Это лучше сделать как

x="\n"
echo -ne $x
Опция

-e будет интерпретировать backslahes для escape-последовательности
-n удаляет конечную новую строку в выходном файле

PS: команда echo имеет эффект, всегда включающий конечную новую строку в выходном файле, поэтому -n требуется отключить эту вещь (и сделать ее менее запутанной)

Ответ 16

Вы также можете использовать эхо с фигурными скобками,

$ (echo hello; echo world)
hello
world

Ответ 17

В bash 4.4 добавлено новое расширение параметров, которое интерпретирует escape-последовательности:

${[email protected]} - E operator

Расширение - это строка, которая представляет собой значение параметра с последовательностями escape-лака с обратной косой чертой, как и механизм $'…' цитирования.

$ foo='hello\nworld'
$ echo "${[email protected]}"
hello
world

Ответ 18

Я не мог получить какие-либо предложения в этом ответе, потому что, как оказалось, я пытался использовать его в функции, которая возвращает значение, и все сообщения echo (и printf) в этой функции были добавляется к возвращаемому значению после индивидуального удаления строк новой строки.

Вот вопрос относительно этого, с очень тщательным ответом:

Как отладить функцию bash, которая возвращает значение, и как добавить символы новой строки в переменную?

Это было похоже на трехчасовой тайный тур.

Ответ 19

Иногда вы можете передать несколько строк, разделенных пробелом, и будет интерпретироваться как \n.

Например, при использовании сценария оболочки для многострочных уведомлений:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now ''date +"%s"'

Ответ 20

Если вы пишете сценарии и несколько раз будете повторять строки как часть других сообщений, хорошим кроссплатформенным решением будет поместить буквенную строку в переменную следующим образом:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined

Ответ 21

Мне пришлось заключить текст в двойные кавычки при использовании в качестве псевдонима в профиле bash (MacOx, iTerm).

alias helloworld="echo -e \"hello \n world\""

Ответ 22

В некоторых случаях вы должны отобразить длинный контент (например, код) с некоторой конкатенацией env var и хотите упростить его.

echo -e, printf может иметь некоторые ограничения

Вы можете использовать специальный символ в качестве заполнителя для переноса строки (например, ~)

и попробуйте это:

echo ${content} | tr '~' '\n' > $targetFile

это должно вызвать другую программу (tr), которая должна быть хорошей IMO.