Echo newline в Bash печатает литерал n

в Bash, попробовал это:

echo -e "hellonworld"

но он не печатает новую строку, только n. Как заставить его напечатать новую строку?

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

17 ответов


вы могли бы использовать printf вместо:

printf "hello\nworld\n"

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


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

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

echo $'hello\nworld'

печать

hello
world

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

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


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

например

echo "Hello"
echo ""
echo "World"

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

#!/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;

попробовать

echo -e "hello\nworld"
hello
world

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


это работает для меня в raspbian,

echo -e "hello\nworld"


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

POSIX 7 на echo

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

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

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

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

так использовать printf вместо:

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

на Файл Формате:

\n переместите положение печати в начало следующей строки.

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

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

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


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

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v \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)

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


мой скрипт:

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

выход:

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

на моем сценарии bash я злился, как вы, пока я не попробовал:

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

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

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

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

$ (echo hello; echo world)
hello
world

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

x="\n"
echo -ne $x

опции-e растолкует backslahes для escape последовательность
- N опция удалит конечную новую строку в выводе

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


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

echo "hello
world"

это работает для меня на моем macOS.


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

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

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

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

${parameter@operator} - E operator

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

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world

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

echo -e ""hello\nworld""