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
EOFals 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 <==
EOFAusgabe:
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 <==
BLKBeispielausgabe:
3Mehrzeilige 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 <==
EOFDie 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 <==
EOFTab-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
fiWenn 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
karthickSie 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
EOFBeispielausgabe:
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
COMMENTSHinweis: 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
EOFAnstatt 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
EOFBeispielausgabe:
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
EOFHereDoc 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()
EOFHereDoc 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..
EOFWenn 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
-Thinzufü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
doneAbschluss
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



