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


2368

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

echo -e "hello\nworld"

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

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


266
Для тех, кто говорит «это работает для меня», поведение эха довольно сильно отличается в разных версиях. Некоторые даже напечатают «-e» как часть своего вывода. Если вам нужно предсказуемое поведение для чего-то нетривиального, используйте вместо этого printf (как в ответе @ sth).
Гордон Дэвиссон

6
Я не смог заставить работать ни одно из предложений в этом ответе, потому что, как оказалось, я пытался использовать его в функции, которая возвращает значение , и все сообщения echo (и printf) в функции добавлялись к возвращаемое значение после индивидуального удаления новых строк . Вот вопрос, касающийся этого, с очень тщательным ответом: stackoverflow.com/questions/27872069/… Это было похоже на трехчасовой загадочный тур.
aliteralmind

8
Также примечательно: в Unix & Linux Stack Exchange принятый ответ на Как добавлять новые строки при использовании echo
Грэм Перрин

@GrahamPerrin, спасибо за ссылку на очень хороший и подробный ответ! Я думаю, что это лучше, чем ответы ниже.
Константин

2
echo -ne "hello \ nworld" (вам нужен флаг n для интерпретации выходов), но, как говорят другие, разные команды echo могут иметь разные результаты!
Кончог,

Ответы:


2882

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

printf "hello\nworld\n"

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


49
или даже printf %"s\n" hello world- printf будет повторно использовать формат, если задано слишком много аргументов
glenn jackman 12.12.11

28
ОП спрашивал о echo, а не printf; и ответ @ choroba ниже, который использует опцию -e, отлично дополняет счет.
JESii

57
@JESii: Это подходит, если вы echoподдерживаете -eопцию.
STH

11
В некоторых версиях echo, -eпросто печатается в самом выводе, поэтому я думаю, что этот ответ совершенно верный, поскольку echoздесь не согласуется (если мы не говорим о конкретной версии).
Теджас Манохар

14
Это хорошо, если printf доступен, но в отличие от echo иногда printf отсутствует в дистрибутиве.
bigtunacan

1714

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

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

368
-e флаг сделал это для меня, что «позволяет интерпретировать обратные
слэши

21
Я думаю, что -eparam не существует на всех * nix OS
kenorb

12
@kenorb: существует в bash. Это встроенный.
Чороба

Почему третий работает? Без $ возвращается «Hello n world»
Эван Донован,

21
Как уже упоминалось, другие -e НЕ работают для всех дистрибутивов и версий. В некоторых случаях он игнорируется, а в других он будет фактически распечатан. Я не верю, что это исправило это для ОП, поэтому не следует принимать ответ
csga5000

578
echo $'hello\nworld'

печать

hello
world

$''Строки использовать ANSI C Цитирование :

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


15
@EvgeniSergeev Не знаю, что ты имеешь в виду, но у меня это тоже не сработало. И это потому, что я использовал двойные кавычки и оказалось, что это работает только с одинарными кавычками! Пробовал в Терминале на Mac.
августа

11
Проблемы с переменными в строке не раскрываются.
Виллемд

Вы все еще можете объединять строки в двойных кавычках. `foo =" bar "; echo $ '' $ foo'efoot'`
Kamafeather

141

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

например

echo "Hello"
echo ""
echo "World"

6
echo ""работает для меня, и я думаю, что это самая простая форма для печати новой строки, даже если это не дает прямого ответа на вопрос. Приветствия.
Марио Авад

2
Я думаю, что это менее очевидно (и, следовательно, потенциально более запутанно), чем echo -en "\n".
Д.Бедренко

72
echoдостаточно, чтобы получить пустую строку
ROMANIA_engineer

5
@Okneloper Работает просто отлично для меня.
Мэтью Читал

71

Пытаться

echo -e "hello\nworld"
hello
world

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

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

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


41

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

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

Убедитесь, что вы заключили переменную в кавычки, прежде чем выводить ее из метода.
ingyhere

23

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

echo -e "hello\\nworld"

2
У меня работает и в GitBash на Windows 7 ;-)
Big Rich

3
Одной обратной косой черты должно быть достаточно
Феликс Д.

23

POSIX 7 на эхо

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

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

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

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

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

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

Формат файла нотация :

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

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

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

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


17

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

echo

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


3
Значительно недооцененный ответ, не могу поверить, что этот вопрос набрал более 20 ответов с 2011 года, и что ни один из них не содержит этого простого решения.
Прометей

псевдоним c = 'эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; эхо; Это единственный способ очистить экран, спасибо!
Ахи тунец

@ Ахи Тунец: Пожалуйста, используйте вместо этого сочетания клавиш консоли :)
R Sun

@RSun, и как мне это сделать в окне терминала Debian на Chromebook?
Ахи тунец

1
@AhiTuna clear; или ctrl + l;
Майк

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

На самом деле это отличный ответ, поскольку он работает для конкатенации строк. Большой!
LavaScornedOven

1
Зачем пытаться вызвать вторую программу? Дело не в том, что мы пытаемся написать приложение реального времени на bash;), но это не обязательно.
Феликс Д.

это действительно отличный ответ, который должен работать везде, несмотря ни на что. Вы спасли моего друга дня @alinsoar
Kotak


6

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

echo "hello
world"

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

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


Как вы печатаете разрыв строки без использования оболочки для запуска команды при нажатии Ènter`?
Ксенос

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

5

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

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)

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


4

Мой сценарий:

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:

4
Просто заметьте, что вы, вероятно, захотите использовать $ {} вокруг имен переменных, так как это не может привести к очень странному поведению, когда оболочка находит переменную с именем $ warningsFound и печатает ее, а не два отдельных вывода.
dragon788

@ dragon788 может я что-то упускаю, но переменная IS на самом деле называется $ warningsFound?
psynnott

2
Я пропустил слово об этом. Если у вас есть переменная с именем $ warnings, в некоторых случаях без использования $ {warningsFound}, вы можете получить содержимое переменной $ warnings + «Found» вместо переменной, которую вы намеревались.
dragon788

3

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

$ (echo hello; echo world)
hello
world

синтаксическая ошибка рядом с неожиданным токеном `('при вызове в файле .sh
cosbor11

1
попробуйтеecho hello; echo world
Avinash Raj

1
Или "echo hello && echo world" или просто: "echo hello echo world
csga5000

3

Это может быть лучше сделано как

x="\n"
echo -ne $x

Опция -e интерпретирует обратную косую черту для escape-последовательности.
Опция -n удаляет завершающий символ новой строки в выходных данных.

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


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

3

Существует новое расширение параметр добавлен в bash 4.4который интерпретирует управляющие последовательности:

${parameter@operator} - E operator

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

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

2

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

newline='
'

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

0

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

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

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

Это неверно Это никогда не интерпретируется как \n. Он интерпретируется как отдельный аргумент для программы, и сама программа может отображать этот аргумент в новой строке, но это не означает, что он был преобразован \nв любой момент и полностью зависит от программы.
Score_Under

0

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

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

0

Это привело меня туда ....

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

Урожайность:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]


-2

Дополнительное решение:

В случаях, вы должны повторить многострочное из длинного содержимого (например, код / ​​конфигурации)

Например :

  • Скрипт Bash для генерации кодов / конфигураций

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.