Hier-Dokumente
Die Shell bietet die Möglichkeit, Eingaben für Programme direkt in das
Shell-Skript mit aufzunehmen - womit die Möglichkeit einer zusätzlichen, externen Datei wegfällt.Eingeleitet werden Hier-Dokumente mit << und anschließend einer Zeichenfolge, die das Ende des Hier-Dokuments anzeigt. Diese Zeichenfolge steht dann alleine am Anfang einer neuen Zeile (und gehört nicht mehr zum Hier-Dokument). Bei Quoting der Ende-Zeichenfolge (eingeschlossen in "...", '...'), werden die Datenzeilen von den üblichen Ersetzungsmechanismen ausgeschlossen. Dazu ein Beispiel: Die Shell-Skript "hier" enthält folgende Zeilen:
cat << EOT
Dieser Text wird ausgegeben, als ob er von
einer externen Datei kaeme - na ja, nicht ganz so.
Die letzte Zeile enthaelt nur das EOT und wird
nicht mit ausgegeben. Die folgende Zeile wuerde
bei der Eingabe aus einer Datei nicht ersetzt.
Parameter: $*
EOT
Aufruf:
$ hier eins zwei
Dieser Text wird ausgegeben, als ob er von
einer externen Datei kaeme - na ja, nicht ganz so.
Die letzte Zeile enthaelt nur das EOT und wird
nicht mit ausgegeben. Die folgende Zeile wuerde
bei der Eingabe aus einer Datei nicht ersetzt.
Parameter: eins zwei
Außerden wäre bei der Eingabe aus einer Datei die Ersetzung von '$*'
durch die aktuellen Parameter nicht möglich. Hier-Dokumente bieten also
weitere Vorteile. Diese Vorteile lassen sich besonders gut ausspielen,
wenn man eine Datei mit ed bearbeitet und dabei die Editor-Kommandos
als Hier-Dokument mitgibt. Durch in die Kommandos eingestreute Variablen
wird die ganze Dateibearbeitung auch variabel steuerbar.
Noch ein Beispiel, diesmal die Simulation des Kommandos 'wall'.
for X in `who | cut -d' ' -f1`
do
write $X << TEXTENDE
Hallo Leute,
das Wetter ist schoen. Wollen wir da nicht um 17 Uhr Schluss machen
und in den Biergarten gehen?
TEXTENDE
done
Die Variablenersetzung oder andere Substitutionen im Text finden nur statt, wenn
das Wort hinter dem Umleitungsoperator keine Quotation (einfache oder doppelte
Anführungszeichen, Backslash) enthält. Text und Endmarkierung lassen sich
leider nicht einrücken: Führende Leer- oder Tabulatorzeichen würden
Bestandteil des Textes, und eine eingerückte Endmarkierung erkennt die
Shell nicht. Ohne Einrückungen hingegen sind Skripte oft schlechter lesbar.
Die Boume-Shell verfügt deshalb über den zweiten Operator <<-,
der Tabulatorzeichen am Zeilenanfang ignoriert.
|