Echo новий рядок у Bash друкує буквально \ n


2361

У Bash спробували це:

echo -e "hello\nworld"

Але він не друкує лише новий рядок \n. Як я можу змусити його друкувати новий рядок?

Я використовую Ubuntu 11.04.


263
Для тих, хто каже: "це працює на мене", поведінка ехо дуже різниться між версіями. Деякі навіть надрукують "-e" як частину свого виводу. Якщо ви хочете передбачити поведінку для будь-якого нетривіального, скористайтеся printf (як у відповіді @ sth).
Гордон Девіссон

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

8
Також примітно: в Unix & Linux Stack Exchange прийнята відповідь на тему: Як додавати нові рядки при використанні ехо
Грем Перрін

@GrahamPerrin, дякую за посилання на дуже гарну та детальну відповідь! Я думаю, що це краще, ніж відповіді нижче.
Костянтин

2
echo -ne "привіт \ nworld" (для інтерпретації втечі вам знадобився російський прапор) - але, як кажуть інші, різні команди ехо можуть мати різні результати!
Кончог

Відповіді:


2873

Ви можете використовувати printfзамість цього:

printf "hello\nworld\n"

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


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

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

57
@JESii: Це підходить, якщо echoтрапляється підтримувати цей -eваріант.
sth

11
З деякими версіями echo, -eвін просто надрукований у самому висновку, тому я вважаю, що ця відповідь цілком справедлива, оскільки echoтут не узгоджується (якщо ми не говоримо про конкретну версію).
Техас Манохар

14
Це добре і добре, якщо доступний printf, але на відміну від луни іноді printf не знаходиться в дистрибутиві.
bigtunacan

1712

Ви впевнені, що перебуваєте в басі? Для мене працює всі чотири способи:

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

368
-e прапор зробив це для мене, що "дозволяє інтерпретувати втечі зворотньої косої риси"
tandy

21
Я думаю, що -eпарам не існує у всіх * nix OS
kenorb

12
@kenorb: Він існує в bash. Це вбудований.
choroba

Чому третій працює? Без $ це повертається "Hello n world"
Еван Донован

21
Як зазначають різні інші -e НЕ працює для всіх дистрибутивів та версій. У деяких випадках він ігнорується, а в інших він фактично роздруковується. Я не вірю, що це зафіксовано для проведення ОП, тому не слід приймати відповідь
csga5000

578
echo $'hello\nworld'

відбитки

hello
world

$''рядки використовують ANSI C Цитування :

Слова форми обробляються спеціально. Слово розширюється до рядка , а символи , що ухиляються від косої риски, замінюються відповідно до стандарту ANSI C.$'string'


15
@EvgeniSergeev Не впевнений, що ти маєш на увазі, але спочатку це не працювало для мене. І це тому, що я використовував подвійні лапки і виявляється, це працює лише з одинарними цитатами! Спробував у терміналі на Mac.
trss

11
Проблеми зі змінними в рядку не розширюються.
Віллем

Ви все ще можете об'єднати рядки з подвійним цитуванням. `foo =" бар "; echo $ '' $ foo'efoot'`
Kamafeather

141

Ви завжди могли це зробити echo "" .

напр

echo "Hello"
echo ""
echo "World"

6
echo ""працює для мене, і я думаю, що це найпростіша форма для друку нового рядка, навіть якщо це не відповідає безпосередньо на питання. Ура.
Маріо Авад

2
Я думаю, що це менш очевидно (і, таким чином, потенційно більш заплутано), ніж echo -en "\n".
DBedrenko

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, або якщо будь-який з операндів містить символ <зворотний штрих>, результати визначаються реалізацією.

якщо ви не маєте додаткового розширення XSI.

Тож рекомендую використовувати printfзамість цього, що добре вказано:

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

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

\ n <newline> Перемістіть позицію друку на початок наступного рядка.

Також пам’ятайте, що Ubuntu 15.10 та більшість дистрибутивів реалізують echoяк:

  • вбудований Bash: help echo
  • автономний виконуваний файл: which echo

що може призвести до певної плутанини.


17

Просто введіть

echo

щоб отримати новий рядок


3
Відповідь занижена, я не можу повірити, що це питання набрало 20+ відповідей з 2011 року і що жодна з них не містить цього простого рішення.
Прометей

псевдонім c = 'відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; відлуння; ' Це єдиний спосіб я можу очистити екран, дякую!
Ahi Tuna

@Ahi Tuna: Будь ласка, скористайтеся комбінаціями клавіш на консолі :)
R

@RSun і як би це зробити у вікні термінала Debian на Chromebook?
Ahi Tuna

1
@AhiTuna ясно; або ctrl + l;
Майк насіння

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

Це насправді чудова відповідь, оскільки працює для струнних конкатенацій. Чудово!
LavaScornedOven

1
Навіщо турбуватися викликати другу програму? Справа не в тому, що ми намагаємось писати заявку в реальному часі в bash;), але це не потрібно.
Фелікс Д.

це дійсно чудова відповідь, яка повинна працювати скрізь незалежно від того, що. Ти врятував мого друга @alinsoar
Котак


6

Ви також можете зробити:

echo "hello
world"

Це працює як всередині скрипту, так і з командного рядка.
У командному рядку натисніть Shift+Enter щоб зробити розриви рядка всередині рядка.

Це працює для мене на моєму macOS та моєму Ubuntu 18.04


Як ви вводите розрив рядка, не маючи оболонки для виконання команди при натисканні клавіші Ènter?
Ксенос

@Xenos Це добре працює в сценарії. А в консолі просто натисніть на Shift + Enter, щоб додати новий рядок, щоб уникнути оболонки для запуску незакінченої команди.
vinzee

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:

На моєму баш сценарії я злітав як ти, поки я тільки що не намагався:

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

Просто натисніть клавішу, куди ви хочете вставити цей стрибок. Вихід зараз:

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 опція буде інтерпретувати зворотні риски для послідовності евакуації
-n опція видалить у вихідному рядку зворотний новий рядок

PS: команда echo має ефект завжди включати у вихідний новий рядок, тому n потрібно, щоб вимкнути цю річ (і зробити її менш заплутаною)


echo -ne "привіт \ nworld" для точної відповіді на питання :)
Dhwanit

3

Існує нове розширення параметр доданий в bash 4.4який інтерпретує керуючі послідовності:

${parameter@operator} - E operator

Розширення - це рядок, який є значенням параметра з розширеними послідовностями зворотної косої лінії, як і в $'…'механізмі цитування.

$ 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]

-1

Я просто використовую аргументи без відлуння

echo "Hello"
echo
echo "World"

-2

Додаткове рішення:

У випадках, вам доведеться повторювати багаторядковий довгий вміст (наприклад, код / ​​конфігурації)

Наприклад :

  • Сценарій Bash для генерації кодів / конфігурацій

echo -e, printfможе мати деяке обмеження

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

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

необхідно звернутися до іншої програми ( tr), яка повинна бути добре IMO.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.