Heredoc – bash Tutorial Teil 26

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

Dr. Dirk Colbry, Michigan State
Gnu-bash-logoCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee
19alias
20Der Shebang
21Das sed Kommando
22cd Kommando
23case Verzweigungen
24Arrays
25Signale und trap
26Heredoc
27getopt

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.

Ausgabe von Script Version 1
raspithek.de - Olli Graf
version1Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Ausgabe von Script Version 1

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.

 2 wird der Text aus help.txt angezeigt, die Variable aber nicht ersetzt.
raspithek.de - Olli Graf
version2Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Bei Version 2 wird der Text aus help.txt angezeigt, die Variable aber nicht ersetzt.

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.

raspithek.de - Olli Graf
version3Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
In Version 3 wird die Variable wieder ersetzt.

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.

Version 4 gibt nichts im Terminal aus, die Daten stehen  in test.txt
raspithek.de - Olli Graf
version4Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Version 4 gibt nichts im Terminal aus, die Daten stehen in test.txt

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.

Schreibe einen Kommentar

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
raspithek.de - Olli Graf
WordPress Cookie Hinweis von Real Cookie Banner