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 Umleitung Methode, um mehrere Eingaben an ein Programm oder einen Befehl zu übergeben. Das Konzept von Heredoc bezieht sich nicht ausschließlich auf Bash. Viele gängige Programmiersprachen wie Perl, Ruby, PHP unterstützen heredoc.
In diesem Artikel werfen wir einen Blick auf die Syntax und Verwendung von Heredoc mit einigen Anwendungsfällen aus der Praxis. Alle Beispiele in diesem Artikel sind so gestaltet, dass sie einfach sind, sodass selbst ein Neuling dieses Konzept leicht verstehen kann. Lassen Sie uns einsteigen und mit Heredoc in Bash spielen.
HereDoc-Syntax
Das folgende Diagramm veranschaulicht die Syntax von Heredoc.
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 - Das Delimiter-Token bezeichnet den Anfang und das Ende des Dokuments (Codeblock). Das Trennzeichen-Token kann beliebig sein, sollte aber identisch sein. Normalerweise sehen Sie
EOF
wird als Trennzeichen verwendet, was "End Of File Stream" bedeutet.
Mehrzeiligen String mit HereDoc in Bash drucken
Beginnen wir mit einem einfachen Beispiel für die Umleitung einer mehrzeiligen Zeichenfolge und deren Ausgabe auf dem Terminal.
Die cat
Der Befehl akzeptiert einen Stream von Eingaben und mit Heredoc, und Sie können 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 <==
Sehen Sie sich das obige Code-Snippet an. Ich habe drei Zeilen, die auf cat
umgeleitet werden Befehl. Ich verwende EOF
als Trennzeichen. Sie können jedoch alles verwenden, was Sie möchten, aber das Start- und Endtrennzeichen identisch halten.
Versuchen wir es mit einem weiteren einfachen Beispiel. Ich leite die gleichen drei Zeilen auf Wortanzahl um Programm. Ich verwende ein anderes Trennzeichen (BLK
) hier.
$ 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
Umleitung und Pipe-In-HereDoc
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 an die Pipe gesendet werden Betreiber zur weiteren Verarbeitung.
$ 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. Wichtig zu beachten ist, dass nur Tabulatoren unterdrückt werden, keine Leerzeichen.
Schauen Sie sich das folgende Beispiel an. Ich habe demselben Beispiel, das wir in den vorherigen Abschnitten gesehen haben, eine bedingte Anweisung hinzugefügt. Die ersten beiden Zeilen im Heredoc sind mit Tabulatoren (4) und die dritte Zeile mit Zwischenräumen (2) versehen.
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 gesendet 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 Leerzeichen nicht unterdrückt.
Variablen- und Befehlserweiterung in HereDoc
Es ist nicht so, dass Sie nur Zeichenfolgen innerhalb des Heredoc-Codeblocks ü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}"
, ein externer Befehl "whoami"
.
Wenn dieses Snippet gesendet wird, werden Variablen und Befehle erweitert und dann an cat
umgeleitet Befehl.
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 innerhalb des Codeblocks 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 auf no-op
umleiten Befehl (:
).
Die no-op
ist in Bash integriert, die die Eingabe übernimmt und den Exit-Code Null zurückgibt. Sie können dies als Synonym für das in Bash eingebaute "true" betrachten was auch den Exit-Code Null beendet.
: << 'COMMENTS' Author : OStechnix Article : Bash Heredoc BashV : 5.1.4 OS : PoP!_OS COMMENTS
Vorsicht: Fast jeder Texteditor hat die Möglichkeit, mehrere Zeilen auszuwählen, und ermöglicht es Ihnen, per Tastendruck zu kommentieren oder zu entfernen. Es ist besser, bei diesem Ansatz zu bleiben.
Escape-Sonderzeichen in HereDoc
Codeblöcke können Sonderzeichen enthalten. Wenn Sie die Sonderzeichen umgehen möchten, gibt es nur wenige Möglichkeiten, dies zu erreichen.
Sie können das Trennzeichen mit single einschließen oder doppelte Anführungszeichen oder Präfix Backslash mit dem Trennzeichen. 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 einen Backslash hinzufügen vor Sonderzeichen.
cat << EOF I am using the \${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Beispielausgabe:
I am using the ${SHELL} shell karthick
HereDoc-Anwendungsfall
Bis jetzt haben wir das Kernkonstrukt von Heredoc und seine grundlegende Verwendung gesehen. Sehen wir uns nun einige Anwendungsfälle aus dem wirklichen Leben an. Meiner Erfahrung nach habe ich Heredoc bei der Arbeit mit ssh und Datenbankclients verwendet, bei denen ich eine Gruppe von Befehlen ausführen muss.
Beispiel 1:Als anderer Benutzer innerhalb des Skripts ausführen
In einigen Fällen möchten Sie möglicherweise bestimmte Teile Ihres Codes als ein 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 an su
um Befehl, der den Benutzer zu "ostechnix" umschaltet und erstellt eine Datei namens test wenn es nicht existiert.
su - ostechnix << EOF if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOF
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 innerhalb des Heredocs werden Codeblockbefehle übergeben, um eine neue Datenbank, Sammlung und das Hinzufügen eines Beispieldokuments zu erstellen.
mongosh << EOF use ostechnix db.data.insertOne({ "Site" : "OsTechnix", "DB" : "Mongo" }) db.data.find().pretty() EOF
Sie kennen MongoDB vielleicht oder auch nicht, aber das ist in Ordnung. Dies soll nur zeigen, wie man Heredoc verwendet, um mit db-Clients zu interagieren. Sie können jeden DB-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 ssh
verwenden Befehl. Normalerweise mit ssh
Befehl können Sie Befehle wie folgt auf dem Remote-Server ausführen.
$ ssh [email protected] "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 [email protected] << EOF Command 1... Command 2.. ..... Command N.. EOF
Wenn derselbe Code über mehrere Knoten ausgeführt werden muss, können Sie for loop
hinzufügen zusammen mit Heredoc. Ich verwende dasselbe Snippet zur Dateierstellung, das wir im ersten Beispiel gesehen haben.
- Die Array-Variable "server" enthält die Liste der Servernamen.
- For-Schleife iteriert über die Array-Variable.
- Der Dateierstellungsbefehl wird an den SSH-Befehl übergeben, der über jeden Server iteriert und Dateien erstellt. Stellen Sie sicher, dass Sie
-T
hinzufügen Flag für den ssh-Befehl, der die Pseudo-Terminal-Zuweisung deaktiviert.
declare -a server=( host1 host2 host3 ) for host in ${server[@]} do ssh -T [email protected]${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
Schlussfolgerung
Heredoc ist ein wichtiges Konzept, das in Bash-Skripten verstanden und verwendet werden muss. Wenn Sie viele Skripte schreiben, erfahren Sie mehr über Heredoc und Möglichkeiten, es optimal zu nutzen.
Wenn Sie Heredoc noch nie verwendet haben, starten Sie das Terminal und probieren Sie alle Codeschnipsel aus dem Artikel aus, um ein besseres Verständnis zu erlangen.
Verwandte Lektüre:
- Bash-Scripting – Variablen mit Beispielen erklärt
- Bash-Scripting – Funktionen mit Beispielen erklärt
- Bash-Echo-Befehl mit Beispielen in Linux erklärt
- Bash-Skripting – For-Schleife mit Beispielen erklärt
- Bash-Skripting – While- und Until-Schleife mit Beispielen erklärt