Wie man Heredoc in Shell -Skripting verwendet

Wie man Heredoc in Shell -Skripting verwendet

Hier dokument (Dokument (Heredoc) ist ein Eingabe- oder Dateistrom -Literal, der als spezieller Codeblock behandelt wird. Dieser Codeblock wird zur Verarbeitung an einen Befehl übergeben. Heredoc Ursprung von Unix Shells und können in beliebten Linux -Shells wie SH, TCSH, KSH, Bash, ZSH, CSH gefunden werden. Insbesondere andere Programmiersprachen wie Perl, Ruby und PHP unterstützen auch Heredoc.

Struktur der Herdoc

Heredoc Verwendet 2 Winkelklammern (<<) gefolgt von einem Trennzeichen Token. Der gleiche Trennzeichen wird verwendet, um den Codeblock zu beenden. Was auch immer im Trennzeichen kommt, wird als Codeblock angesehen.

Schauen Sie sich das Beispiel unten an. Ich leite den Codeblock zum CAT -Befehl um. Hier ist der Trennzeichen auf “BLOCK"Und beendet von demselben"BLOCK“.

Katze << BLOCK Hello World Today Datum ist $ (Datum +%f) mein Heimverzeichnis = $ Home BLOCK 

NOTIZ: Sie sollten denselben Trennzeichen verwenden, um den Block zu starten und den Block zu beenden.

Erstellen Sie multiline Kommentare

Wenn Sie jetzt irgendwann in Bash codieren, wissen Sie vielleicht, dass Bash standardmäßig keine multiline Kommentare wie nicht unterstützt C oder Java. Sie können verwenden Heredoc Um dies zu überwinden.

Dies ist kein integriertes Merkmal von Bash, das mehrzeilige Kommentare unterstützt, sondern nur ein Hack. Wenn Sie nicht umleiten Heredoc In jedem Befehl wird der Interpreter einfach den Codeblock lesen und nichts ausführen.

<< KOMMENTAR Dies ist Kommentarzeile 1 Dies ist Kommentarzeile 2 Dies ist Kommentarzeile 3 KOMMENTAR 
Multiline Kommentare

Umgang mit weißen Räumen

Standardmäßig, Heredoc unterdrückt keine White Space -Zeichen (Registerkarten, Räume). Wir können dieses Verhalten überschreiben, indem wir hinzufügen Bindestrich (-) nach (<<) gefolgt von einem Trennzeichen. Dies unterdrückt alle Laschenräume, aber weiße Räume werden nicht unterdrückt.

Katze <<- BLOCK This line has no whitespace. This line has 2 white spaces at the beginning. This line has a single tab. This line has 2 tabs. This line has 3 tabs. BLOCK 
Handhabungsräume

Variable- und Befehls -Substialität

Heredoc akzeptiert eine variable Substitution. Variablen können benutzerdefinierte Variablen oder Umgebungsvariablen sein.

Heute = $ (Datum +%f) Katze << BLOCK1 # User defined variables Today date is = $TODAY #Environ Variables I am running as = $USER My home dir is = $HOME I am using $SHELL as my shell BLOCK1 

In ähnlicher Weise können Sie alle Befehle innerhalb der ausführen Heredoc Codeblock.

Katze << BLOCK2 $(uname -a) BLOCK2 
Variable und Befehlssubstitution

Spezialfiguren entkommen

Es gibt verschiedene Möglichkeiten, wie wir Sonderfiguren entkommen können. Entweder können Sie es auf Charakterebene oder DOC -Ebene tun.

Um einzelne Sonderzeichen zu entkommen, verwenden Sie a Backslash (\).

Katze << BLOCK4 $(uname -a) BLOCK4 cat << BLOCK5 Today date is = $TODAY BLOCK5 

Um allen Sonderzeichen im Block zu entkommen, umgibt der Trennzeichen mit einzelnen Zitaten, doppelten Zitaten oder einem Präfix -Trennzeichen mit einem Backglash.

Katze << 'BLOCK1' I am running as = $USER BLOCK1 cat << "BLOCK2" I am running as = $USER BLOCK2 cat << \BLOCK3 I am running as = $USER BLOCK3 
Spezialfiguren entkommen

Jetzt, wo wir die Struktur von kennen Heredoc Und wie es funktioniert, sehen wir uns ein paar Beispiele an. Zwei Gemeinschaftsbereiche, in denen ich benutze Heredoc Führen Sie einen Befehlsblock über SSH aus und übergeben SQL -Abfragen durch Heredoc.

Im folgenden Beispiel versuchen wir, einen Codeblock auf einem Remote -Server über SSH auszuführen.

Ausführen von Befehlen über SSH

Im folgenden Beispiel bestehe ich a wählen Aussage an PSQL Um eine Verbindung zu einer Datenbank herzustellen und die Abfrage auszuführen. Dies ist eine alternative Möglichkeit, eine Anfrage zu betreiben PSQL im Bash -Skript im Bash -Skript anstatt das zu verwenden -F Flagge zum Laufen .sql Datei.

#!/usr/bin/env bash uname = postgres dbname = testen psql --username = uname -password - -dbname = $ dbname << BLOCK SELECT * FROM COUNTRIES WHERE region_id = 4; BLOCK 
Ausführen von SQL -Abfrage

Das war's für diesen Artikel. Es gibt noch viel mehr, mit dem Sie anfangen können Heredoc Im Vergleich zu dem, was wir in den Beispielen gezeigt haben. Wenn Sie einen nützlichen Hack mit haben Heredoc Bitte posten Sie es im Kommentarbereich, damit unsere Leser davon profitieren können.