Echo Newline in Bash druckt Literal \ n

2363

Versuchen Sie in Bash Folgendes:

echo -e "hello\nworld"

Es wird jedoch nicht nur eine neue Zeile gedruckt \n. Wie kann ich die Newline drucken lassen?

Ich benutze Ubuntu 11.04.

Sergey
quelle
264
Für diejenigen, die sagen "es funktioniert für mich", variiert das Verhalten des Echos zwischen den Versionen ziemlich stark. Einige drucken sogar das "-e" als Teil ihrer Ausgabe. Wenn Sie ein vorhersehbares Verhalten für etwas nicht Triviales wünschen, verwenden Sie stattdessen printf (wie in der Antwort von @ sth).
Gordon Davisson
6
Ich konnte keinen der Vorschläge in dieser Antwort zum Laufen bringen, da ich, wie sich herausstellte, versucht habe, ihn in einer Funktion zu verwenden, die einen Wert zurückgibt , und alle Echo- (und Printf-) Nachrichten in der Funktion angehängt wurden Der Rückgabewert, nachdem die Zeilenumbrüche einzeln entfernt wurden . Hier ist eine Frage dazu mit einer äußerst gründlichen Antwort: stackoverflow.com/questions/27872069/… Dies war wie eine dreistündige Mystery-Tour.
Aliteralmind
8
Ebenfalls bemerkenswert: In Unix & Linux Stack Exchange die akzeptierte Antwort auf Hinzufügen neuer Zeilen bei Verwendung von Echo
Graham Perrin
@ AbrahamPerrin, danke für den Link zu einer sehr guten und detaillierten Antwort! Ich denke, es ist besser als die Antworten unten.
Konstantin
2
echo -ne "hello \ nworld" (Sie brauchten das n-Flag, um Escape-Zeichen zu interpretieren) - aber wie andere sagen, können unterschiedliche Echo-Befehle unterschiedliche Ergebnisse haben!
Konchog

Antworten:

2878

Sie könnten printfstattdessen verwenden:

printf "hello\nworld\n"

printfhat konsistenteres Verhalten als echo. Das Verhalten von echovariiert stark zwischen verschiedenen Versionen.

etw
quelle
49
oder sogar printf %"s\n" hello world- printf wird das Format wiederverwenden, wenn zu viele Argumente angegeben werden
Glenn Jackman
28
Das OP fragte nach Echo, nicht nach printf; und die Antwort von @ choroba unten, die die Option -e verwendet, füllt die Rechnung perfekt aus.
JESii
57
@JESii: Es passt, wenn Sie echodie -eOption unterstützen.
etw
11
Bei einigen Versionen echo, -eist nur in der Ausgabe selbst gedruckt , damit ich diese Antwort denke vollkommen gültig ist , da echohier nicht konsistent ist (es sei denn , wir sind zu einer bestimmten Version zu sprechen).
Tejas Manohar
14
Dies ist gut und schön, wenn printf verfügbar ist, aber im Gegensatz zu Echo ist printf manchmal nicht in der Distribution.
Bigtunacan
1713

Bist du sicher, dass du in Bash bist? Funktioniert für mich auf alle vier Arten:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
Choroba
quelle
368
-e Flagge hat es für mich getan, was "die Interpretation von Backslash-Fluchten ermöglicht"
Tandy
21
Ich denke, -eparam existiert nicht auf allen * nix OS
Kenorb
12
@kenorb: Es existiert in Bash. Es ist ein eingebautes.
Choroba
Warum funktioniert der dritte? Ohne das $ gibt es "Hello n world" zurück
Evan Donovan
21
Wie von verschiedenen anderen erwähnt, funktioniert -e NICHT für alle Distributionen und Versionen. In einigen Fällen wird es ignoriert und in anderen wird es tatsächlich ausgedruckt. Ich glaube nicht, dass dies das OP behoben hat, daher sollte die Antwort nicht akzeptiert werden
csga5000
578
echo $'hello\nworld'

druckt

hello
world

$''Zeichenfolgen verwenden ANSI C Quoting :

Wörter der Form werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert , wobei Zeichen mit Backslash-Escapezeichen gemäß ANSI C-Standard ersetzt werden.$'string'

Vanuan
quelle
15
@ EvgeniSergeev Ich bin mir nicht sicher, was du meinst, aber es hat auch bei mir nicht funktioniert. Und das liegt daran, dass ich doppelte Anführungszeichen verwendet habe und es sich herausstellt, dass dies nur mit einfachen Anführungszeichen funktioniert! Versucht in Terminal auf Mac.
trss
11
Probleme mit Variablen in der Zeichenfolge, die nicht erweitert werden.
Willemdh
Sie können weiterhin Zeichenfolgen in doppelten Anführungszeichen verketten. `foo =" bar "; echo $ '' $ foo'efoot'`
Kamafeather
141

Das kannst du immer tun echo "".

z.B

echo "Hello"
echo ""
echo "World"
Nayeem Zen
quelle
6
echo ""funktioniert für mich und ich denke, es ist die einfachste Form, eine neue Zeile zu drucken, auch wenn dies die Frage nicht direkt beantwortet. Prost.
Mario Awad
2
Ich denke, es ist weniger offensichtlich (und daher möglicherweise verwirrender) als echo -en "\n".
DBedrenko
72
echoist genug, um eine leere Zeile zu erhalten
ROMANIA_engineer
5
@Okneloper Funktioniert gut für mich.
Matthew Read
71

Versuchen

echo -e "hello\nworld"
hello
world

arbeitete für mich im nanoEditor.

Von der Manpage:

-e Aktivieren Sie die Interpretation von Backslash-Escapezeichen

Harsha Biyani
quelle
41

Achten Sie darauf, dass jemand mit dem Kopf gegen die Wand schlägt, um herauszufinden, warum das Skript eines Kollegen keine Zeilenumbrüche druckt

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

Wie oben kann der tatsächliche Ablauf der Methode selbst in ein Echo eingeschlossen sein, das alle Echos ersetzt, die sich möglicherweise in der Methode selbst befinden. Offensichtlich habe ich dies der Kürze halber verwässert, es war nicht so leicht zu erkennen!

Sie können dann Ihre Kameraden darüber informieren, dass eine bessere Möglichkeit zur Ausführung von Funktionen wie folgt wäre:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;
Onkel Iroh
quelle
Stellen Sie sicher, dass Sie die Variable in Anführungszeichen setzen, bevor Sie sie aus der Methode entfernen.
Ingyhere
23

Das funktioniert bei mir in Raspbian,

echo -e "hello\\nworld"
Sathesh
quelle
2
Funktioniert für mich auch in GitBash unter Windows 7 ;-)
Big Rich
3
Ein einziger Backslash sollte ausreichen
Felix D.
23

POSIX 7 auf Echo

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

-e ist nicht definiert und Backslashes sind implementierungsdefiniert:

Wenn der erste Operand -n ist oder wenn einer der Operanden ein <backslash> -Zeichen enthält, sind die Ergebnisse implementierungsdefiniert.

es sei denn, Sie haben eine optionale XSI-Erweiterung.

Daher empfehle ich, dass Sie printfstattdessen verwenden, was gut spezifiziert ist:

Der Formatoperand wird als Formatzeichenfolge verwendet, die in der XBD-Dateiformatnotation [...] beschrieben ist.

die Dateiformatnotation :

\ n <Neue Zeile> Verschieben Sie die Druckposition an den Anfang der nächsten Zeile.

Denken Sie auch daran, dass Ubuntu 15.10 und die meisten Distributionen echobeide wie folgt implementieren :

  • ein eingebauter Bash: help echo
  • eine eigenständige ausführbare Datei: which echo

was zu Verwirrung führen kann.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
17

Einfach eingeben

echo

um eine neue Zeile zu bekommen

R Sonne
quelle
3
Ich kann nicht glauben, dass diese Frage seit 2011 mehr als 20 Antworten gesammelt hat und dass keine von ihnen diese einfache Lösung enthält.
Prometheus
Alias ​​c = 'echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; Echo; ' Nur so kann ich meinen Bildschirm löschen, danke!
Ahi Thunfisch
@ Ahi Thunfisch: Bitte verwenden Sie stattdessen Ihre Konsolen-Tastaturkürzel :)
R So
@RSun und wie würde ich das in einem Debian-Terminalfenster auf einem Chromebook machen?
Ahi Thunfisch
1
@AhiTuna klar; oder Strg + 1;
Mike Seeds
16
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Alinsoar
quelle
Dies ist eine großartige Antwort, da sie für Zeichenfolgenverkettungen funktioniert. Großartig!
LavaScornedOven
1
Warum sich die Mühe machen, ein zweites Programm aufzurufen? Es ist nicht so, dass wir versuchen, eine Echtzeitanwendung in bash zu schreiben;), aber es ist nicht notwendig.
Felix D.
Das ist wirklich eine großartige Antwort, die überall funktionieren sollte, egal was passiert. Du hast meinen Tagesfreund @alinsoar
Kashyap Kotak
8

Es funktioniert für mich in CentOS:

echo -e ""hello\nworld""
verschwundenzhou
quelle
6

Sie können auch tun:

echo "hello
world"

Dies funktioniert sowohl innerhalb eines Skripts als auch über die Befehlszeile.
Drücken Sie in der Befehlszeile Shift+ Enter, um die Zeilenumbrüche innerhalb der Zeichenfolge auszuführen.

Dies funktioniert für mich unter meinem MacOS und meinem Ubuntu 18.04

vinzee
quelle
Wie können Sie diesen Zeilenumbruch eingeben, ohne dass die Shell den Befehl ausführen muss, wenn Sie die Eingabetaste drücken?
Xenos
@ Xenos Dies funktioniert gut in einem Skript. Klicken Sie in der Konsole einfach auf Umschalt + Eingabetaste, um eine neue Zeile hinzuzufügen, damit die Shell den unvollendeten Befehl nicht ausführt.
Vinzee
5

Ein weiterer Eintrag hier für diejenigen, die es mit keiner dieser Lösungen geschafft haben und einen Rückgabewert von ihrer Funktion erhalten müssen:

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

Nur dieser Trick funktionierte unter Linux, an dem ich mit dieser Bash gearbeitet habe:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

Hoffe, es hilft jemandem mit ähnlichen Problemen.

DNT
quelle
4

Mein Skript:

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

Ausgabe:

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

In meinem Bash-Skript wurde ich so wütend wie du, bis ich es gerade versucht habe:

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

Drücken Sie einfach die Eingabetaste, wo Sie diesen Sprung einfügen möchten. Die Ausgabe lautet jetzt:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
TanisDLJ
quelle
4
Nur eine Anmerkung, Sie werden wahrscheinlich $ {} um Ihre Variablennamen verwenden wollen, da dies zu einem wirklich seltsamen Verhalten führen kann, wenn eine Shell eine Variable namens $ warningsFound findet und diese und nicht die beiden separaten Ausgaben druckt.
Dragon788
@ dragon788 Vielleicht fehlt mir etwas, aber die Variable heißt tatsächlich $ warningsFound?
Psynnott
2
Ich habe ein Wort dazu verpasst. Wenn Sie eine Variable namens $ warnings hatten, in einigen Fällen ohne Verwendung von $ {warningsFound}, könnten Sie möglicherweise den Inhalt von $ warnings + "Found" anstelle der von Ihnen beabsichtigten Variablen erhalten.
Dragon788
3

Sie können auch Echo mit geschweiften Klammern verwenden.

$ (echo hello; echo world)
hello
world
Avinash Raj
quelle
Syntaxfehler in der Nähe des unerwarteten Tokens `('beim Aufruf in der .sh-Datei
cosbor11
1
versuchen Sieecho hello; echo world
Avinash Raj
1
Oder "Echo Hallo && Echo Welt" oder einfach: "Echo Hallo Echo Welt
csga5000
3

Dies könnte besser gemacht werden als

x="\n"
echo -ne $x

Die Option -e interpretiert Backslahes für die Escape-Sequenz
-n Option entfernt die nachfolgende neue Zeile in der Ausgabe

PS: Das Befehlsecho bewirkt, dass immer eine nachgestellte neue Zeile in die Ausgabe aufgenommen wird, sodass -n erforderlich ist, um das Ding auszuschalten (und es weniger verwirrend zu machen).

Dhwanit
quelle
echo -ne "hallo \ nwelt" für die genaue Antwort auf die Frage :)
Dhwanit
3

Es wurde eine neue Parametererweiterung hinzugefügt bash 4.4, die Escape-Sequenzen interpretiert:

${parameter@operator} - E operator

Die Erweiterung ist eine Zeichenfolge, bei der es sich um den Wert eines Parameters handelt, bei dem Backslash-Escape-Sequenzen wie beim $'…'Anführungszeichen erweitert wurden.

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

Wenn Sie Skripte schreiben und mehrmals Zeilenumbrüche als Teil anderer Nachrichten wiedergeben, besteht eine gute plattformübergreifende Lösung darin, eine wörtliche Zeilenumbruch in eine Variable wie die folgende einzufügen:

newline='
'

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

Manchmal können Sie mehrere durch ein Leerzeichen getrennte Zeichenfolgen übergeben, die als interpretiert werden \n.

Zum Beispiel, wenn Sie ein Shell-Skript für mehrzeilige Benachrichtigungen verwenden:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
Hunter Frazier
quelle
Das ist falsch. Es wird niemals als interpretiert \n. Es wird als separates Argument für das Programm interpretiert, und das Programm selbst kann dieses Argument in einer neuen Zeile anzeigen. Dies bedeutet jedoch nicht, dass es zu \nirgendeinem Zeitpunkt konvertiert wurde und vollständig vom Programm abhängig ist.
Score_Under
0

Ich musste den Text mit doppelten Anführungszeichen umgeben, während ich ihn als Alias ​​im Bash-Profil (MacOx, iTerm) verwendete.

alias helloworld="echo -e \"hello \n world\""
John Jai
quelle
0

Das hat mich dorthin gebracht ...

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

Ausbeuten:

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]
Joe Healy
quelle
-1

Ich benutze nur Echo keine Argumente

echo "Hello"
echo
echo "World"
Xenon
quelle
-2

Zusätzliche Lösung:

In einigen Fällen müssen Sie den langen Inhalt (z. B. Code / Konfigurationen) mehrzeilig wiedergeben.

Beispielsweise :

  • Ein Bash-Skript zum Generieren von Codes / Konfigurationen

echo -e, printf Könnte eine gewisse Einschränkung haben

Sie können ein spezielles Zeichen als Platzhalter als Zeilenumbruch verwenden (z. B. ~) und es ersetzen, nachdem die Datei mit erstellt wurdetr

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

Es muss ein anderes Programm ( tr) aufgerufen werden, das IMO in Ordnung sein sollte.

ZenithS
quelle