Website-Suche

Bash Heredoc-Tutorial für Anfänger


Bei der Arbeit mit Bash-Skripten kann es vorkommen, dass Sie eine Reihe von Eingaben mit demselben Befehl verarbeiten müssen. Glücklicherweise gibt es in Bash eine Möglichkeit, dies mit HereDoc optimaler zu erreichen.

HereDoc, Akronym für Here Document, ist eine Eingabe-Umleitungsmethode, um mehrere Eingaben an ein Programm oder einen Befehl weiterzuleiten. Das Konzept von Heredoc bezieht sich nicht ausschließlich auf Bash. Viele beliebte Programmiersprachen wie Perl, Ruby und PHP unterstützen Heredoc.

In diesem Artikel werfen wir einen Blick auf die Syntax und Verwendung von Heredoc anhand einiger realer Anwendungsfälle. Alle Beispiele in diesem Artikel sind so konzipiert, dass sie einfach sind, sodass auch ein Neuling dieses Konzept leicht verstehen kann. Lasst uns einsteigen und mit Heredoc in Bash spielen.

HereDoc-Syntax

Das folgende Diagramm veranschaulicht die Syntax von Heredoc.

Grafische Darstellung der HereDoc-Syntax

Hier,

  • Befehl - Jeder Befehl (cat, wc, mail usw.), der eine Umleitung akzeptiert.
  • Umleitungsoperator (<<) - Der Standardoperator für HereDoc ist <<. Es leitet den Codeblock zur Verarbeitung an den Befehl weiter.
  • Trennzeichen-Token - Das Trennzeichen-Token bezeichnet den Anfang und das Ende des Dokuments (Codeblocks). Das Trennzeichen-Token kann alles sein, sollte aber identisch sein. Typischerweise werden EOF als Trennzeichen verwendet, was „Ende des Dateistreams“ bedeutet.

Drucken einer mehrzeiligen Zeichenfolge mit HereDoc in Bash

Beginnen wir mit einem einfachen Beispiel für die Umleitung einer mehrzeiligen Zeichenfolge und deren Ausgabe auf dem Terminal.

Der Befehl cat akzeptiert einen Strom von Eingaben und mit Heredoc können Sie den Codeblock umleiten, um ihn auf dem Terminal auszugeben.

$ cat << EOF
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
EOF

Ausgabe:

Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==

Schauen Sie sich den obigen Codeausschnitt an. Ich habe drei Zeilen, die zum Befehl cat umgeleitet werden. Ich verwende EOF als Trennzeichen. Sie können jedoch alles verwenden, was Sie möchten, aber das Anfangs- und Endtrennzeichen identisch lassen.

Versuchen wir es mit einem weiteren einfachen Beispiel. Ich leite das gleiche dreizeilige Programm zum Wortzählen um. Ich verwende hier ein anderes Trennzeichen (BLK).

$ wc -l << BLK
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
BLK

Beispielausgabe:

3

Mehrzeilige Zeichenfolge mit Heredoc drucken

Umleiten und HereinleitenDoc

Sie können den Ausgabeumleitungsoperator mit Heredoc kombinieren und die Ausgabe in eine Datei umleiten, anstatt sie auf dem Terminal zu drucken.

Ich verwende dasselbe Beispiel wie im vorherigen Abschnitt und leite die Ausgabe in eine Datei mit dem Namen log_op.txt um.

$ cat << EOF > /tmp/log_op.txt
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
EOF

Die Ausgabe von Heredoc kann zur weiteren Verarbeitung an den Pipe-Operator gesendet werden.

$ cat << EOF | grep -i sla
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
EOF

Tab-Unterdrückung in HereDoc

Wenn Ihr Codeblock Leerzeichen (Tabs) enthält und Sie diese unterdrücken möchten, verwenden Sie "-" nach dem Umleitungsoperator. Ein wichtiger Punkt ist, dass nur Tabulatoren unterdrückt werden, keine Leerzeichen.

Schauen Sie sich das folgende Beispiel an. Ich habe dem gleichen Beispiel, das wir in den vorherigen Abschnitten gesehen haben, eine bedingte Anweisung hinzugefügt. Die ersten beiden Zeilen in Heredoc sind mit Tabulatoren versehen (4) und die dritte Zeile ist mit Abständen versehen (2).

if [[ $x = "err" ]]
then
 cat <<- err_msg
     1. Something is wrong with the input file received for today.
     2. Contact the downstream team to get it corrected.
   3. ==> SLA MISSED <==
err_msg
fi

Wenn das Code-Snippet übermittelt wird, sieht meine Ausgabe wie folgt aus.

1. Something is wrong with the input file received for today.
2. Contact the downstream team to get it corrected.
   3. ==> SLA MISSED <==

Wie Sie sehen können, werden die Tabulatoren in Zeile 1 und 2 unterdrückt, aber in Zeile 3 werden sie nicht unterdrückt, da Leerzeichen verwendet werden.

Variablen- und Befehlserweiterung in HereDoc

Es ist nicht so, dass Sie innerhalb des Heredoc-Codeblocks nur Zeichenfolgen übergeben können. Sie können benutzerdefinierte und Umgebungsvariablen übergeben und Befehle innerhalb des Codeblocks ausführen.

Schauen Sie sich das folgende Beispiel an. Innerhalb des Codeblocks habe ich eine benutzerdefinierte Variable "$ {AUTHOR}", eine Umgebungsvariable "$ {SHELL}" und einen externen Befehl "whoami".

Wenn dieses Snippet übermittelt wird, werden Variablen und Befehle erweitert und dann zum Befehl cat umgeleitet.

AUTHOR="OSTechNix"

cat << EOF
Author: ${AUTHOR}                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Beispielausgabe:

Author: OsTechnix
Article: Bash Heredoc
I am using the /bin/bash shell
karthick

Sie können das Starttrennzeichen in einfache Anführungszeichen setzen, um die Erweiterung innerhalb des Codeblocks zu unterdrücken. Auf diese Weise wird alles im Codeblock als String-Literal behandelt.

cat << 'EOF'
Author: ${AUTHOR}                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Beispielausgabe:

Author: ${AUTHOR}            
Article: Bash Heredoc
I am using the ${SHELL} shell
$(whoami)

Mehrzeilige Kommentare mit HereDoc

Wie Sie vielleicht bereits wissen, unterstützt Bash keine mehrzeiligen Kommentare. Mit Heredoc können Sie mehrzeilige Kommentare erstellen, indem Sie den Codeblock an den Befehl no-op (:) umleiten.

Der no-op ist in die Bash integriert, nimmt die Eingabe entgegen und gibt den Exit-Code Null zurück. Sie können dies als Synonym für das in der Bash integrierte „true“ betrachten, das auch den Exit-Code Null beendet.

: << 'COMMENTS'
Author : OStechnix
Article : Bash Heredoc
BashV : 5.1.4
OS : PoP!_OS
COMMENTS

Hinweis: Fast jeder Texteditor verfügt über die Funktion zur Auswahl mehrerer Zeilen und ermöglicht das Kommentieren bzw. Entfernen von Kommentaren per Tastendruck. Es ist besser, bei diesem Ansatz zu bleiben.

Sonderzeichen in HereDoc maskieren

Codeblöcke können Sonderzeichen enthalten. Wenn Sie die Sonderzeichen umgehen möchten, gibt es mehrere Möglichkeiten, dies zu erreichen.

Sie können das Trennzeichen in einfache oder doppelte Anführungszeichen einschließen oder dem Trennzeichen einen Backslash voranstellen. Auf diese Weise werden alle Sonderzeichen maskiert.

# SINGLE QUOTES ESCAPE
cat << 'EOF'
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF
# DOUBLE QUOTES ESCAPE
cat << "EOF"
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF
# BACKSLASH ESCAPE
cat << \EOF
I am using the ${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Anstatt alle Sonderzeichen zu maskieren, können Sie auch bestimmte Sonderzeichen innerhalb des Blocks maskieren, indem Sie vor jedem Sonderzeichen einen Backslash hinzufügen.

cat << EOF
I am using the \${SHELL} shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Beispielausgabe:

I am using the ${SHELL} shell      
karthick      

HereDoc-Anwendungsfall

Bisher haben wir das Kernkonstrukt von Heredoc und seine grundlegende Verwendung gesehen. Sehen wir uns nun einige Anwendungsfälle aus der Praxis an. Meiner Erfahrung nach habe ich Heredoc bei der Arbeit mit SSH und Datenbank-Clients verwendet, bei denen ich eine Gruppe von Befehlen ausführen muss.

Beispiel 1: Ausführung als anderer Benutzer innerhalb des Skripts

In manchen Fällen möchten Sie möglicherweise bestimmte Teile Ihres Codes als anderer Benutzer ausführen. In diesem Fall können Sie Heredoc verwenden, um die Befehle so umzuleiten, dass sie unter einem anderen Benutzer ausgeführt werden.

Schauen Sie sich das folgende Beispiel an. Ich leite den Codeblock zum Befehl su um, der den Benutzer zu "ostechnix" umschaltet und gegebenenfalls eine Datei mit dem Namen test erstellt ist nicht vorhanden.

su - ostechnix << EOF
if [[ ! -f /home/ostechnix/test ]];then
 touch /home/ostechnix/test
 echo "File Created"
else
 echo "File exists"
fi
EOF

HereDoc mit anderem Benutzer

Beispiel 2: Verwendung von HereDoc mit DB Client

Wenn Sie eine Reihe von Befehlen für eine Datenbank ausführen möchten, ist Heredoc hilfreich.

Schauen Sie sich das folgende Beispiel an. Ich interagiere mit dem MongoDB-Client mongosh und im Heredoc werden Codeblockbefehle übergeben, um eine neue Datenbank und Sammlung zu erstellen und ein Beispieldokument hinzuzufügen.

mongosh << EOF
use ostechnix
db.data.insertOne({
    "Site" : "OsTechnix",
    "DB"  : "Mongo"
})
db.data.find().pretty()
EOF

HereDoc mit MongoDB-Client

Möglicherweise kennen Sie MongoDB oder auch nicht, aber das ist in Ordnung. Dies dient nur dazu, zu zeigen, wie man Heredoc für die Interaktion mit DB-Clients verwendet. Sie können jeden Datenbank-Client wie MySQL, psql, sqlite verwenden, je nachdem, mit welcher Datenbank Sie arbeiten.

Beispiel 3: Ausführen von Remote-Befehlen mit HereDoc und SSH

Wenn Sie Befehle über den Remote-Server ausführen möchten, können Sie Heredoc in Kombination mit dem Befehl ssh verwenden. Normalerweise können Sie mit dem Befehl ssh Befehle auf dem Remote-Server wie folgt ausführen.

ssh user@host "command"

Sie müssen denselben Befehl immer wieder wiederholen, wenn Sie weitere Befehle auf dem Remote-Host ausführen möchten. Mit Heredoc können Sie alle Befehle gruppieren und ausführen.

ssh -T user@host << EOF
Command 1...
Command 2..
.....
Command N..
EOF

Wenn derselbe Code auf mehreren Knoten ausgeführt werden muss, können Sie zusammen mit Heredoc eine for-Schleife hinzufügen. Ich verwende dasselbe Dateierstellungs-Snippet, das wir im ersten Beispiel gesehen haben.

  • Die Array-Variable „server“ enthält die Liste der Servernamen.
  • Die For-Schleife durchläuft die Array-Variable.
  • Der Befehl zum Erstellen der Datei wird an den SSH-Befehl übergeben, der die einzelnen Server durchläuft und dort Dateien erstellt. Stellen Sie sicher, dass Sie dem SSH-Befehl das Flag -T hinzufügen, das die Pseudo-Terminal-Zuweisung deaktiviert.
declare -a server=( host1 host2 host3 )
for host in ${server[@]}
do
  ssh -T user@${host} << EOF
  echo "Running at host - ${host}"
  if [[ ! -f /home/ostechnix/test ]];then
    touch /home/ostechnix/test
    echo "File Created"
  else
    echo "File exists"
  fi
EOF
done

Abschluss

Heredoc ist ein wichtiges Konzept, das es zu verstehen und in Bash-Skripten zu verwenden gilt. Wenn Sie viele Skripte schreiben, erfahren Sie mehr über Heredoc und erfahren, wie Sie es optimal nutzen können.

Wenn Sie Heredoc noch nie zuvor verwendet haben, starten Sie das Terminal und probieren Sie alle Codeausschnitte aus dem Artikel aus, um ein besseres Verständnis zu erhalten.

Verwandte Lektüre:

  • Bash-Scripting - Variablen anhand von Beispielen erklärt
  • Bash Scripting - Funktionen anhand von Beispielen erklärt
  • Bash-Echo-Befehl anhand von Beispielen unter Linux erklärt
  • Bash-Scripting - For-Schleife anhand von Beispielen erklärt
  • Bash-Skripting - While- und Until-Schleife anhand von Beispielen erklärt

Verwandte Artikel