Эхо новой строки в Bash печатает буквально \ n

1779

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

echo -e "hello\nworld"

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

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

  • 213
    Для тех, кто говорит «это работает для меня», поведение эха довольно сильно различается в разных версиях. Некоторые даже напечатают "-e" как часть своего вывода. Если вам нужно предсказуемое поведение для чего-то нетривиального, используйте вместо этого printf (как в ответе @ sth).
  • 3
    Я не смог заставить работать ни одно из предложений в этом ответе, потому что, как оказалось, я пытался использовать его в функции, которая возвращает значение , и все сообщения echo (и printf) в функции добавлялись к возвращаемое значение после индивидуального удаления строк . Вот вопрос, касающийся этого, с очень тщательным ответом: stackoverflow.com/questions/27872069/… Это было похоже на трехчасовой загадочный тур.
Показать ещё 4 комментария
Теги:
echo
newline

18 ответов

1974
Лучший ответ

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

printf "hello\nworld\n"

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

  • 38
    или даже printf %"s\n" hello world - printf повторно использует формат, если задано слишком много аргументов
  • 16
    ОП спрашивал о echo, а не printf; и ответ @ choroba ниже, который использует опцию -e, отлично дополняет счет.
Показать ещё 11 комментариев
1291

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

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
  • 291
    -e флаг сделал это для меня, что «позволяет интерпретировать обратную косую черту»
  • 13
    Я думаю, что -e param не существует на всех * nix ОС
Показать ещё 11 комментариев
465
echo $'hello\nworld'

печатает

hello
world

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

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

  • 0
    Это ни у кого не работает? Дайте нам знать.
  • 9
    @EvgeniSergeev Не знаю, что ты имеешь в виду, но у меня это тоже не сработало. И это потому, что я использовал двойные кавычки и оказалось, что это работает только с одинарными кавычками! Пробовал в Терминале на Mac.
Показать ещё 1 комментарий
106

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

например.

echo "Hello"
echo ""
echo "World"
  • 4
    echo "" работает для меня, и я думаю, что это самая простая форма для печати новой строки, даже если это не дает прямого ответа на вопрос. Приветствия.
  • 1
    Я думаю, что это менее очевидно (и, следовательно, потенциально более запутанно), чем echo -en "\n" .
Показать ещё 3 комментария
35

В случайном случае, когда кто-то обнаруживает, что они бьют головой о стену, пытаясь понять, почему сотрудник 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;
  • 0
    Убедитесь, что вы заключили переменную в кавычки, прежде чем выводить ее из метода.
24

Пытаться

echo -e "hello\nworld"
hello
world

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

18

Это работает для меня на рапсском языке,

echo -e "hello\\nworld"

  • 2
    У меня работает и в GitBash на Windows 7 ;-)
  • 3
    Одной обратной косой черты должно быть достаточно
Показать ещё 1 комментарий
15

POSIX 7 на эхо

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

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

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

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

Поэтому используйте printf:

Оператор формата

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

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

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

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

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

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

15
str='hello\nworld'
$ echo | sed "i$str"
hello
world
  • 0
    На самом деле это отличный ответ, так как он работает для конкатенации строк. Большой!
  • 1
    Зачем вызывать вторую программу? Дело не в том, что мы пытаемся написать приложение в реальном времени на bash;), но это не обязательно.
Показать ещё 1 комментарий
4

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

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)

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

3

Мой 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:
  • 3
    Просто заметьте, что вы, вероятно, захотите использовать $ {} вокруг имен переменных, так как это не может привести к очень странному поведению, когда оболочка находит переменную с именем $ warningsFound и печатает ее, а не два отдельных вывода.
  • 0
    @ dragon788 может быть, я что-то упустил, но переменная IS на самом деле называется $ warningsFound?
Показать ещё 1 комментарий
2

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

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

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

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

  • 0
    echo -ne "hello \ nworld" для точного ответа на вопрос :)
2

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

$ (echo hello; echo world)
hello
world
  • 0
    синтаксическая ошибка рядом с неожиданным токеном `('при вызове в файле .sh
  • 1
    попробуйте echo hello; echo world
Показать ещё 1 комментарий
1

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

echo "hello
world"

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

  • 0
    Как набрать этот разрыв строки, не имея оболочки для запуска команды при нажатии Ènter`?
  • 0
    @ Xenos Это хорошо работает в сценарии. И на моем macOS, я просто нажимаю Shift + Enter, и это работает.
1

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

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

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

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

0

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

echo -e ""hello\nworld""
0

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

${parameter@operator} - E operator

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

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

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

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

#!/bin/bash
notify-send 'notification success' 'another line' 'time now ''date +"%s"'
  • 0
    Это неверно Он никогда не интерпретируется как \n . Он интерпретируется как отдельный аргумент для программы, и сама программа может отображать этот аргумент в новой строке, но это не означает, что он был преобразован в \n в любой момент и полностью зависит от программы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню