Manchmal muss ein Script langen Fließtext ausgeben. Dafür gibt es verschiedene Möglichkeiten. Die vermutlich komfortabelste ist Heredoc.

| 1 | Einführung |
|---|---|
| 2 | Der bash Prompt |
| 3 | key bindings |
| 4 | Der Startvorgang |
| 5 | Environment Variablen |
| 6 | builtin commands |
| 7 | Arbeiten mit Dateien |
| 8 | nano |
| 9 | bash Scripting |
| 10 | Variablen |
| 11 | Verzweigungen (if) |
| 12 | Schleifen |
| 13 | Kommandozeilenparameter |
| 14 | exit Codes bash Tutorial Teil 14 |
| 15 | von der Idee zum Script |
| 16 | grep |
| 17 | Piping und Redirection |
| 18 | tee |
| 19 | alias |
| 20 | Der Shebang |
| 21 | Das sed Kommando |
| 22 | cd Kommando |
| 23 | case Verzweigungen |
| 24 | Arrays |
| 25 | Signale und trap |
| 26 | Heredoc |
| 27 | getopt |
Der Text
Ich habe hier erstmal eine Beispieldatei help.txt mit einem kurzen Text, den ein Script ausgeben soll. Dies kann auch die Bedienungsanleitung des Kommandos sein, die normalerweise mit dem Parameter --help abrufbar ist.
Dies ist ein Beispiel für
einen mehrzeiligen Text,
der für einen Hilfetext steht.
Programm: ${0##*/}"
Was es mit der letzten Zeile auf sich hat, wirst du gleich sehen.
Dieser Text soll jetzt von einem Script ausgegeben werden.
Version 1: echo
Eine Möglichkeit ist die, die jeder kennt. Wir lassen jede Zeile durch ein echo Kommando ausgeben.
#! /usr/bin/bash
# Version 1: Ausgabe über echo
usage() {
echo "Dies ist ein Beispiel für"
echo "einen mehrzeiligen Text,"
echo "der für einen Hilfetext steht."
echo "Programm: ${0##*/}"
}
usage
exit 0
Das Lästige an dieser Lösung ist, dass Wir jede Zeile des Texts mit Anführungszeichen umgeben müssen.
Wenn ich dass Script jetzt starte, siehst du, dass in der letzten Zeile der Name des Scripts ausgegeben wird.

Eine bessere Lösung ist Version 2
Version 2
In Version 2 lagern wir den Text in die externe Datei help.txt aus, die wir mittels des cat Kommandos ausgeben lassen.
#! /usr/bin/bash
# Version 2: Ausgabe einer externen Datei mit cat
usage() {
cat help.txt
}
usage
exit 0
Jetzt ist der Text zwar viel einfacher zu bearbeiten, allerdings müssen wir bei jedem neuen Release von version2.sh daran denken, auch help.txt zu aktualisieren und auszuliefern. Außerdem ist eine Ausgabe von Variablenwerten hier nicht möglich.

Version 3
Wir brauchen also eine Möglichkeit, den Text einfach in den Scriptcode aufzunehmen ohne die lästigen Anführungszeichen von Version 1. Hier kommt jetzt Heredoc ins Spiel. Damit wird ein Block als Dokument deklariert, das in jedes Kommando, dass von stdin liest hinein gepiped werden kann.
#! /usr/bin/bash
# Version 3: Text als here Doc innerhalb des Scripts
usage() {
cat <<- EOF
Dies ist ein Beispiel für
einen mehrzeiligen Text,
der für einen Hilfetext steht.
Programm: ${0##*/}"
EOF
}
usage
exit 0
Wir benutzen hier wieder das cat Kommando zur Ausgabe, nur liest es jetzt nicht aus der Datei sondern bekommt seine Ausgabedaten aus dem nachfolgenden Block hineingepiped.Die Syntax ist dabei wie folgt:
Kommando <<- EOF Dies ist ein Beispiel für
einen mehrzeiligen Text,
der für einen Hilfetext steht.
Programm: ${0##*/}"
EOF
Mit dem << wird gepiped, das - dahinter besagt, dass die führenden Tabulatoren bei der Ausgabe weggelassen werden. Mit EOF startet der Block, der mit dem nachfolgenden EOF endet. Der Block muss nicht unbedingt mit EOF umschlossen sein, sondern kann jeden beliebigen Namen tragen, so lange er zu Beginn und am Endes des Blocks identisch ist.
Ich arbeite meistens mit Tab, um jede Zeile einzurücken, dass ist meiner Meinung nach übersichtlicher. Die EOF Markierung ist fast sowas wie eine Konvention.
Heredoc wird von der bash seit der ersten Version unterstützt. Allerdings ist es kein Alleinstellungsmerkmal. Das Konzept wurde schon Ende der 1970er Jahre vom britischen Informatiker Stephen Bourne erstellt und floss in seine Bourne-Shell (dem Vorgänger der bash) ein. Auch in Programmiersprachen wie Perl, PHP und Python wird Heredoc unterstützt.

Version 4
In Version 4 möchte ich dir einen kleinen Kniff zeigen. Da wir mit Heredoc Daten in cat hinein pumpen, können wir die Ausgabe auch in eine Datei umlenken.
#! /usr/bin/bash
# Version 3: Text als here Doc innerhalb des Scripts,
# diesmal mit Redirection in eine Datei.
usage() {
cat <<- EOF > test.txt
Dies ist ein Beispiel für
einen mehrzeiligen Text,
der für einen Hilfetext steht.
Programm: ${0##*/}"
EOF
}
usage
exit 0
Jetzt wird nach dem Blockbeginn mit > test.txt die Ausgabe von cat in die Datei test.txt umgelenkt. Ein praktischer Nutzen dafür ist mir bislang nicht untergekommen.

Fazit
Um lange Texte, wie z.B. die Hilfe eines Scripts auszugeben, bietet Heredoc eine gute Möglichkeit, um Fliesstext im Scriptcode abzulegen und zu bearbeiten. Hier findest du alle Scripts.