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.
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:
-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
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'
@ 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'`
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
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/bashfunction 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/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
GET_RECORDS;
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
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
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)
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.
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).
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
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
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.
Antworten:
Sie könnten
printf
stattdessen verwenden:printf
hat konsistenteres Verhalten alsecho
. Das Verhalten vonecho
variiert stark zwischen verschiedenen Versionen.quelle
printf %"s\n" hello world
- printf wird das Format wiederverwenden, wenn zu viele Argumente angegeben werdenecho
die-e
Option unterstützen.echo
,-e
ist nur in der Ausgabe selbst gedruckt , damit ich diese Antwort denke vollkommen gültig ist , daecho
hier nicht konsistent ist (es sei denn , wir sind zu einer bestimmten Version zu sprechen).Bist du sicher, dass du in Bash bist? Funktioniert für mich auf alle vier Arten:
quelle
-e
param existiert nicht auf allen * nix OSdruckt
$''
Zeichenfolgen verwenden ANSI C Quoting :quelle
Das kannst du immer tun
echo ""
.z.B
quelle
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.echo -en "\n"
.echo
ist genug, um eine leere Zeile zu erhaltenVersuchen
arbeitete für mich im
nano
Editor.Von der Manpage:
quelle
Achten Sie darauf, dass jemand mit dem Kopf gegen die Wand schlägt, um herauszufinden, warum das Skript eines Kollegen keine Zeilenumbrüche druckt
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:
quelle
Das funktioniert bei mir in Raspbian,
quelle
POSIX 7 auf Echo
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
ist nicht definiert und Backslashes sind implementierungsdefiniert:es sei denn, Sie haben eine optionale XSI-Erweiterung.
Daher empfehle ich, dass Sie
printf
stattdessen verwenden, was gut spezifiziert ist:die Dateiformatnotation :
Denken Sie auch daran, dass Ubuntu 15.10 und die meisten Distributionen
echo
beide wie folgt implementieren :help echo
which echo
was zu Verwirrung führen kann.
quelle
Einfach eingeben
um eine neue Zeile zu bekommen
quelle
quelle
Es funktioniert für mich in CentOS:
quelle
Sie können auch tun:
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
quelle
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:
Nur dieser Trick funktionierte unter Linux, an dem ich mit dieser Bash gearbeitet habe:
Hoffe, es hilft jemandem mit ähnlichen Problemen.
quelle
Mein Skript:
Ausgabe:
In meinem Bash-Skript wurde ich so wütend wie du, bis ich es gerade versucht habe:
Drücken Sie einfach die Eingabetaste, wo Sie diesen Sprung einfügen möchten. Die Ausgabe lautet jetzt:
quelle
Sie können auch Echo mit geschweiften Klammern verwenden.
quelle
echo hello; echo world
Dies könnte besser gemacht werden als
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).
quelle
Es wurde eine neue Parametererweiterung hinzugefügt
bash 4.4
, die Escape-Sequenzen interpretiert:quelle
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:
quelle
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:
quelle
\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\n
irgendeinem Zeitpunkt konvertiert wurde und vollständig vom Programm abhängig ist.Ich musste den Text mit doppelten Anführungszeichen umgeben, während ich ihn als Alias im Bash-Profil (MacOx, iTerm) verwendete.
quelle
Das hat mich dorthin gebracht ...
Ausbeuten:
quelle
Ich benutze nur Echo keine Argumente
quelle
Zusätzliche Lösung:
In einigen Fällen müssen Sie den langen Inhalt (z. B. Code / Konfigurationen) mehrzeilig wiedergeben.
Beispielsweise :
echo -e
,printf
Könnte eine gewisse Einschränkung habenSie können ein spezielles Zeichen als Platzhalter als Zeilenumbruch verwenden (z. B.
~
) und es ersetzen, nachdem die Datei mit erstellt wurdetr
Es muss ein anderes Programm (
tr
) aufgerufen werden, das IMO in Ordnung sein sollte.quelle