it-swarm.com.de

Echo Newline in Bash druckt Literal \ n

In Bash versuchte dies:

echo -e "hello\nworld"

Es wird jedoch kein Zeilenumbruch ausgegeben, sondern nur \n. Wie kann ich die neue Zeile drucken lassen?

Ich benutze Ubuntu 11.04.

2061
Sergey

Sie könnten stattdessen printf verwenden:

printf "hello\nworld\n"

printf hat ein konsistenteres Verhalten als echo. Das Verhalten von echo ist in den verschiedenen Versionen sehr unterschiedlich.

2529
sth

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

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
1533
choroba
echo $'hello\nworld'

druckt

hello
world

$'' Zeichenfolgen verwenden ANSI C Quoting :

Wörter der Form $'string' werden speziell behandelt. Das Wort erweitert sich zu zeichenfolge, wobei mit einem Backslash versehene Zeichen gemäß dem ANSI C-Standard ersetzt werden.

521
Vanuan

Du könntest immer echo "" machen.

z.B.

echo "Hello"
echo ""
echo "World"
122
Nayeem Zen

In dem Fall, dass jemand mit dem Kopf gegen die Wand schlägt und herausfindet, warum ein Mitarbeiter-Skript keine Zeilenumbrüche druckt, achten Sie darauf ->

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

echo $(GET_RECORDS);

Wie oben beschrieben, kann der tatsächliche Ablauf der Methode selbst in ein Echo eingebunden werden, das alle Echos in der Methode selbst ersetzt. Offensichtlich habe ich dies der Kürze halber verwässert, es war nicht so einfach zu erkennen!

Sie können dann Ihren Kameraden mitteilen, dass eine bessere Art, Funktionen auszuführen, folgendermaßen aussehen würde:

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

GET_RECORDS;
39
Uncle Iroh

Versuchen

echo -e "hello\nworld"
hello
world

arbeitete für mich im Nano-Editor.

34
Harsha Biyani

Das funktioniert bei mir in Raspbian,

echo -e "hello\\nworld"
23
Sathesh

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 einen <Backslash> -Zeichen enthält, sind die Ergebnisse implementierungsdefiniert.

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

Daher empfehle ich, stattdessen printf zu verwenden, das genau angegeben ist:

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

die Dateiformat Notation :

\ n <neue Zeile> Verschiebt die Druckposition an den Anfang der nächsten Zeile.

Denken Sie auch daran, dass Ubuntu 15.10 und die meisten Distributionen echo implementieren als:

  • a Bash eingebaut: help echo
  • eine eigenständige ausführbare Datei: which echo

was zu Verwirrung führen kann.

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

Es funktioniert bei mir in CentOS:

echo -e ""hello\nworld""
9
vanishedzhou

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 die Zeilenumbrüche innerhalb der Zeichenfolge zu tun.

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

5
vinzee

Einfach eintippen

echo

eine neue Zeile bekommen

4
SiteTester

Ein weiterer Eintrag hier für diejenigen, die mit keiner dieser Lösungen erfolgreich waren 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 hat unter Linux funktioniert, 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 ähnlichem Problem.

4
DNT

Mein Drehbuch:

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 wütend wie du, bis ich es gerade ausprobiert habe:

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

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

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
4
TanisDLJ

Dies könnte besser gemacht werden als

x="\n"
echo -ne $x

-e Option interpretiert Backslahes für die Escape-Sequenz
Die Option - n entfernt den Zeilenumbruch in der Ausgabe

PS: Das Befehlsecho fügt der Ausgabe immer eine nachgestellte Zeile hinzu, sodass -n erforderlich ist, um das Ding auszuschalten (und es weniger verwirrend zu machen).

3
Dhwanit

Es gibt ein neues Parametererweiterung in _bash 4.4_, das Escape-Sequenzen interpretiert:

${[email protected]} - E operator

Die Erweiterung ist eine Zeichenfolge, die den Wert eines Parameters mit umgekehrten Schrägstrich-Escape-Sequenzen darstellt, die wie beim _$'…'_ -Anführungszeichenmechanismus erweitert wurden.

_$ foo='hello\nworld'
$ echo "${[email protected]}"
hello
world
_
2
PesaThe

Sie könnten auch Echo mit Klammern verwenden,

$ (echo hello; echo world)
hello
world
2
Avinash Raj

In einigen Fällen müssen Sie den langen Inhalt (z. B. Code) mit etwas Env-Var-Konkatination wiedergeben und wollten es einfach machen.

echo -e, printf können Einschränkungen aufweisen

Sie können ein Sonderzeichen als Platzhalter für Zeilenumbrüche verwenden (z. B. ~).

und versuche dies:

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

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

0
ZenithS

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

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

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

Wenn Sie Skripte schreiben und mehrmals Zeilenumbrüche als Teil anderer Nachrichten wiedergeben, besteht eine plattformübergreifende Lösung darin, einen wörtlichen 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
0
skiggety

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\""
0
John Jai