HOWTO · Bash
So erstellen Sie einen mehrzeiligen String in Bash
Lernen Sie fünf Möglichkeiten kennen, mehrzeiligen Text in Bash zu erstellen und ihn mit einem Here-Document, einer Variablen, printf und zwei echo-Ansätzen in eine Datei zu schreiben.
Auf dieser Seite
Bash kann mehrzeiligen Text mit einem here-document, einer Variable, printf oder echo in eine Datei schreiben. Diese fünf Beispiele zeigen, wie die Methoden funktionieren und welche sich für Ihren Text eignet. Für einen kurzen, feststehenden Textblock bleibt das Skript mit einem here-document gut lesbar. Eine Variable ist praktisch, wenn Sie den Text zunächst vorbereiten oder wiederverwenden möchten. Mit printf lässt sich die Zeilenformatierung gezielt steuern; die beiden echo-Beispiele eignen sich für einfachen Text beziehungsweise Escape-Sequenzen.
Mit here-document eine mehrzeilige Zeichenkette in Bash erstellen
Ein here-document übergibt die Zeilen zwischen <<'EOF' und dem passenden Abschlussbegrenzer EOF an die Standardeingabe eines Befehls. Hier liest cat diese Zeilen, und > leitet die Ausgabe nach output.txt um. Eine vorhandene Datei wird dabei überschrieben. Durch die Anführungszeichen um den Begrenzer bleibt der Inhalt wörtlich erhalten; die Shell erweitert darin also weder Variablen noch andere Ausdrücke. Setzen Sie den Begrenzer allein in eine Zeile und fügen Sie danach keine weiteren Zeichen ein, damit Bash das Ende des Inhalts erkennt.
Die Datei enthält:
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/output.txt"
cat > "$output_file" <<'EOF'
Hello
World
!
EOF
cat "$output_file"
Hello
World
!
Der Befehl schreibt direkt in die Datei und eignet sich daher, wenn der Text bereits feststeht und den bisherigen Inhalt ersetzen soll. Um neue Zeilen an vorhandenen Inhalt anzuhängen, verwenden Sie stattdessen die Umleitung zum Anhängen (>>). Wählen Sie in einem Skript einen Dateipfad, in den das Skript schreiben darf, und verwenden Sie am Anfang und Ende des here-document denselben Begrenzer. Einrückende normale Leerzeichen im Inhalt bleiben erhalten. Für eingerückten Quellcode unterstützt Bash außerdem <<-; damit werden führende Tabulatoren entfernt, normale Leerzeichen jedoch nicht.
Mit einer Shell-Variable eine mehrzeilige Zeichenkette in Bash erstellen
Eine Zuweisung in Anführungszeichen kann wörtliche Zeilenumbrüche enthalten. Setzen Sie die Variable beim Schreiben in doppelte Anführungszeichen, damit die Zeilenumbrüche Teil einer einzigen Zeichenkette bleiben und keine Wortaufteilung stattfindet. Dieses Muster ist nützlich, wenn ein Wert einmal zusammengesetzt und anschließend an mehrere Befehle oder Dateien übergeben wird. Setzen Sie die Variable bei jeder Verwendung in Anführungszeichen.
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
greet="Hello,
World
!"
printf '%s\n' "$greet" > "$output_file"
cat "$output_file"
Hello,
World
!
Die Expansion "$greet" in Anführungszeichen erhält die Zeilenumbrüche in der Variable. Das ist hilfreich, wenn Sie den Text vor dem Schreiben zusammensetzen oder wiederverwenden. Das abschließende printf fügt nach dem Wert einen Zeilenumbruch ein. Endet der gespeicherte Text bereits mit einem Zeilenumbruch, fügt das Format einen weiteren hinzu.
Mit printf eine mehrzeilige Zeichenkette in Bash erstellen
Verwenden Sie printf, wenn Sie die Formatierung ausdrücklich steuern möchten. Das Format %s\n gibt jedes Argument als Text aus und hängt einen Zeilenumbruch an; mit > wird die Ausgabe in die Datei umgeleitet. Jedes Argument steht dadurch in einer eigenen Zeile, sodass sich die Zuordnung zwischen Werten und Ausgabe leicht nachvollziehen lässt.
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
printf '%s\n' 'Hello' ',' 'World' '!' > "$output_file"
cat "$output_file"
Hello
,
World
!
Diese Methode ist auch bei beliebigem Text gut vorhersehbar, weil printf die übergebenen Wörter als Daten behandelt und nicht als Formatangaben interpretiert. Halten Sie die Formatzeichenkette von Werten getrennt, die % enthalten können. Liegt die Eingabe bereits in einer mehrzeiligen Variable vor, übergeben Sie sie als einzelnes Argument mit printf '%s\n' "$greet", statt ihren Wert in die Formatzeichenkette einzusetzen.
Mit echo und der Option -e eine mehrzeilige Zeichenkette in Bash erstellen
Die Option -e weist echo an, Escape-Sequenzen wie \n zu interpretieren. Für feststehenden Text kann das knapp sein. Das Verhalten von echo -e unterscheidet sich jedoch je nach Shell; wenn eine Formatierung über verschiedene Shells hinweg konsistent sein muss, verwenden Sie printf. Im folgenden Beispiel stehen die Escape-Sequenzen in einem Argument in Anführungszeichen, und der erzeugte Text wird in die Datei umgeleitet.
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
echo -e 'Hello\n,\nWorld\n!' > "$output_file"
cat "$output_file"
Hello
,
World
!
Einfache Anführungszeichen erhalten die Backslash-Sequenzen, bis echo sie interpretiert. Die Umleitung schreibt die daraus entstehenden Zeilen in die Datei. Da das Verhalten der Option von der Shell abhängt, sollten Sie sich nicht darauf verlassen, wenn ein Skript in unterschiedlichen Shell-Umgebungen eine identische Formatierung erzeugen muss.
Mit echo eine mehrzeilige Zeichenkette in Bash erstellen
Enthält eine Variable bereits wörtliche Zeilenumbrüche, schreibt echo "$greet" sie dank der Anführungszeichen als Zeilenumbrüche, ohne Escape-Sequenzen interpretieren zu müssen. Das unterscheidet sich von der Verwendung von -e mit Backslash-Sequenzen. Für einen einfachen Wert ist diese Variante praktisch. Wenn Sie den abschließenden Zeilenumbruch oder die Formatierung von Werten gezielt steuern müssen, ist printf die bessere Wahl.
tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT
output_file="$tmp_dir/multiline.txt"
greet="Hello
,
World
!"
echo "$greet" > "$output_file"
cat "$output_file"
Hello
,
World
!
Doppelte Anführungszeichen erhalten die Zeilenumbrüche in der Variable und verhindern zugleich eine Wortaufteilung. echo fügt außerdem einen abschließenden Zeilenumbruch hinzu, was für gewöhnliche Textdateien passend ist. Verwenden Sie >, wenn die Datei ausschließlich diesen Text enthalten soll, und >>, wenn der neue Text an den vorhandenen Inhalt angehängt werden soll.