GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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 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

Linux
  1. Bash HereDoc Tutorial mit Beispielen

  2. Linux-CD-Befehls-Tutorial für Anfänger (8 Beispiele)

  3. Linux-Kommando-Tutorial für Anfänger (5 Beispiele)

  4. Linux-df-Befehls-Tutorial für Anfänger (8 Beispiele)

  5. Linux Date Command Tutorial für Anfänger (8 Beispiele)

Linux nl Command Tutorial für Anfänger (7 Beispiele)

Linux-nm-Befehls-Tutorial für Anfänger (10 Beispiele)

Linux OD Command Tutorial für Anfänger (6 Beispiele)

Linux w Command Tutorial für Anfänger (5 Beispiele)

Linux ss Command Tutorial für Anfänger (8 Beispiele)

Bash-Scripting-Tutorial für Anfänger