Die Lösung besteht zum $'string'
Beispiel darin, Folgendes zu verwenden :
$ STR=$'Hello\nWorld'
$ echo "$STR" # quotes are required here!
Hello
World
Hier ist ein Auszug aus der Bash-Handbuchseite:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not
been present.
A double-quoted string preceded by a dollar sign ($"string") will cause
the string to be translated according to the current locale. If the
current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
STR=$"Hello\nWorld"
einfach druckenHello\nWorld
.H="Hello"; W="World"; STR="${H}"$'\n'"${W}"; echo "${STR}"
wird "Hallo" und "Welt" in separaten Zeilen wiedergegebenEcho ist so neunzig und voller Gefahren, dass seine Verwendung zu Core-Dumps von nicht weniger als 4 GB führen sollte. Im Ernst, die Probleme von echo waren der Grund, warum der Unix-Standardisierungsprozess schließlich das
printf
Dienstprogramm erfand und alle Probleme beseitigte.So erhalten Sie eine neue Zeile in einer Zeichenfolge:
Dort! Kein SYSV vs BSD Echo-Wahnsinn, alles wird ordentlich gedruckt und unterstützt vollständig C-Escape-Sequenzen. Jeder bitte
printf
jetzt benutzen und niemals zurückblicken.quelle
$'string'
noch sauberer ist.$'foo'
Syntax ist ab 2013 keine gültige POSIX-Syntax. Viele Shells werden sich beschweren.BAR=$(printf "hello\nworld\n")
druckt das Trailing nicht \ n für mich$()
wird von POSIX als Entfernen von Sequenzen eines oder mehrerer <newline> -Zeichen am Ende der Ersetzung angegeben .Was ich basierend auf den anderen Antworten getan habe, war
quelle
Das Problem liegt nicht bei der Shell. Das Problem liegt tatsächlich beim
echo
Befehl selbst und beim Fehlen doppelter Anführungszeichen um die Variableninterpolation. Sie können versuchen, dies zu verwendenecho -e
, dies wird jedoch nicht auf allen Plattformen unterstützt. Einer der Gründeprintf
wird jetzt für die Portabilität empfohlen.Sie können auch versuchen, die neue Zeile direkt in Ihr Shell-Skript einzufügen (wenn Sie ein Skript schreiben), damit es so aussieht ...
oder äquivalent
quelle
Ich finde die
-e
Flagge elegant und geradlinigWenn die Zeichenfolge die Ausgabe eines anderen Befehls ist, verwende ich nur Anführungszeichen
quelle
echo
.echo -e
ist bekannt für seine Portabilitätsprobleme. Dies ist derzeit weniger eine Situation im Wilden Westen als vor POSIX, aber es gibt immer noch keinen Grund, dies zu bevorzugenecho -e
. Siehe auch stackoverflow.com/questions/11530203/…Die einzige einfache Alternative besteht darin, tatsächlich eine neue Zeile in die Variable einzugeben:
Ja, das bedeutet, Enterwo nötig in den Code zu schreiben .
Es gibt mehrere Entsprechungen zu einem
new line
Charakter.Aber all diese erfordern "eine Interpretation" durch ein Werkzeug ( POSIX printf ):
Daher muss das Tool eine Zeichenfolge mit einer neuen Zeile erstellen:
In einigen Shells ist die Sequenz $'eine spezielle Shell-Erweiterung. Bekannt für die Arbeit in ksh93, bash und zsh:
Natürlich sind auch komplexere Lösungen möglich:
Oder
quelle
Ein $ direkt vor einfachen Anführungszeichen '... \ n ...' wie folgt, doppelte Anführungszeichen funktionieren jedoch nicht.
quelle
Ich bin kein Bash-Experte, aber dieser hat für mich funktioniert:
Ich fand es einfacher, die Texte zu formatieren.
quelle
$NEWSTR
inecho "$NEWSTR"
sind hier wichtigAuf meinem System (Ubuntu 17.10) funktioniert Ihr Beispiel wie gewünscht, sowohl wenn es über die Befehlszeile (in
sh
) eingegeben als auch alssh
Skript ausgeführt wird:Ich denke, das beantwortet Ihre Frage: Es funktioniert einfach. (Ich habe nicht versucht, Details herauszufinden, wie zu welchem Zeitpunkt genau die Ersetzung des Zeilenumbruchs durch
\n
erfolgtsh
).Ich bemerkte jedoch, dass sich dasselbe Skript bei der Ausführung mit
bash
anders verhalten undHello\nWorld
stattdessen ausdrucken würde :Ich habe es geschafft, die gewünschte Ausgabe
bash
wie folgt zu erhalten:Beachten Sie die doppelten Anführungszeichen
$STR
. Dies verhält sich identisch, wenn es gespeichert und alsbash
Skript ausgeführt wird.Das Folgende gibt auch die gewünschte Ausgabe:
quelle
Diejenigen, die nur den Zeilenumbruch benötigen und den mehrzeiligen Code verachten, der die Einrückung unterbricht, könnten Folgendes tun:
Bash (und wahrscheinlich auch andere Shells) verschlingen alle nachfolgenden Zeilenumbrüche nach dem Ersetzen des Befehls. Sie müssen die
printf
Zeichenfolge daher mit einem Nicht-Zeilenumbruchzeichen beenden und anschließend löschen. Dies kann auch leicht zu einem Oneliner werden.quelle
Ich war mit keiner der Optionen hier wirklich zufrieden. Das hat bei mir funktioniert.
quelle
str=$(printf '%s\n' "first line" "another line" "and another line")
(die Shell schneidet bequem (oder nicht) alle endgültigen Zeilenumbrüche aus der Befehlsersetzung ab). Einige Antworten hier werden bereitsprintf
in verschiedenen Formen beworben, daher bin ich mir nicht sicher, ob dies als separate Antwort einen Mehrwert bietet.printf '%s\n' "first line" \
(Zeilenumbruch, Einzug)'second line'
usw. Siehe auchprintf -v str
für die Zuweisung zu einer Variablen, ohne eine Unterschale zu erzeugen.