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


в Баш, попробовал это:

echo -e "hellonworld"

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

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

17 1663

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 вместо:

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

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

\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 опция будет интерпретировать обратные слэхи для 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""