Heredocs in Bash – mehrzeilige Texte, Konfigurationen und SQL ohne Echo-Wüste
Zwanzig echo-Zeilen für eine Konfigurationsdatei sind mühsam und fehleranfällig. Ein Heredoc schreibt den Text so, wie er aussehen soll – mit oder ohne Variablen, je nachdem, wie du den Marker schreibst.
Mehrzeilige Ausgabe mit echo zu bauen, endet immer gleich: irgendwo fehlt ein \n, irgendwo ein Anführungszeichen. Ein Heredoc nimmt den Text am Stück.
Die Grundform
cat > /etc/meinapp.conf <<CONF
port = 8080
logdir = /var/log/meinapp
debug = false
CONFAlles zwischen <<CONF und der Zeile mit CONF landet in der Datei. Der Marker ist frei wählbar – Hauptsache, er kommt im Text nicht vor.
Mit oder ohne Variablen – der entscheidende Unterschied
name="Michael"
cat <<TEXT # Variablen werden ersetzt
Hallo $name, heute ist $(date +%A).
TEXT
cat <<'TEXT' # Marker in Anführungszeichen: nichts wird ersetzt
Preis: $9.99 – und $HOME bleibt $HOME.
TEXTDie zweite Form ist die richtige für alles, was Dollarzeichen enthält: Skripte, die du schreibst, AWK-Programme, Vorlagen mit Platzhaltern.
Eingerückt schreiben mit <<-
sichern() {
cat <<-SQL | sqlite3 daten.db
DELETE FROM sitzungen WHERE ablauf < unixepoch();
VACUUM;
SQL
}<<- entfernt führende Tabulatoren (keine Leerzeichen!) – damit bleibt der Code eingerückt, ohne dass die Einrückung in der Ausgabe landet.
Herestring: wenn eine Zeile reicht
jq '.name' <<< "$json"
read -r jahr monat <<< "2026 09"
grep -c fehler <<< "$protokoll"<<< schiebt einen einzelnen String auf die Standardeingabe – kürzer als echo "$x" | und ohne zusätzlichen Prozess.
Praktisch: Mail, SSH und Dateien in einem Rutsch
ssh server <<'FERN'
cd /srv/app
git pull --ff-only
systemctl --user restart app
FERN
mail -s "Nachtlauf fertig" ich@example.com <<BERICHT
Verarbeitet: $anzahl Dateien
Dauer: $((SECONDS / 60)) Minuten
Fehler: ${fehler:-keine}
BERICHTFallstrick
Der schließende Marker muss allein in einer Zeile stehen, ohne Leerzeichen davor (außer bei <<-, und dort nur mit Tabs) und ohne irgendetwas dahinter – sonst liest die Shell den Rest des Skripts als Text und meldet erst am Dateiende einen Fehler. Und beim Verschachteln: Zwei Heredocs mit demselben Marker im selben Skript vertragen sich nicht; nimm sprechende Namen wie SQL, CONF, MAIL.
Automatisierung, Deployment-Skripte und Nachtläufe schreibe ich regelmäßig – wenn bei dir noch vieles von Hand läuft: bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Standardwerte und Pflichtvariablen in Bash – ${VAR:-…} und ${VAR:?…}
Fehlt eine Umgebungsvariable, läuft das Skript oft trotzdem los – und löscht dann /backup/ statt /backup/kunde42/. Die Shell kann Standardwerte setzen und fehlende Werte laut einfordern, ohne eine einzige if-Abfrage.
Warum "$@" in Anführungszeichen gehört – Quoting und Arrays in Bash
Ein Dateiname mit Leerzeichen, und aus einem Argument werden zwei. Das ist keine Kleinigkeit: Genau daraus entstehen Skripte, die die falsche Datei löschen. Die Regeln dafür passen auf eine Seite.
trap und mktemp – Skripte, die auch nach einem Abbruch aufräumen
Ein Skript legt eine temporäre Datei an, bricht in der Mitte ab – und die Datei bleibt liegen. Nach ein paar Wochen ist /tmp voll und niemand weiß, woher der Müll kommt. Zwei Zeilen lösen das dauerhaft.