GNU/Linux >> Tutoriels Linux >  >> Linux

Tutoriel Bash Heredoc pour les débutants

Lorsque vous travaillez avec des scripts Bash, vous pouvez vous retrouver dans une situation où vous devez traiter une série d'entrées à l'aide de la même commande. Heureusement, il existe un moyen dans Bash d'y parvenir de manière plus optimale en utilisant HereDoc .

HereDoc, acronyme de Here Document , est une entrée Redirection méthode pour transmettre plusieurs entrées à un programme ou à une commande. Le concept d'heredoc n'est pas exclusivement lié à Bash seul. De nombreux langages de programmation populaires comme Perl, Ruby, PHP prennent en charge heredoc.

Dans cet article, nous examinerons la syntaxe et l'utilisation d'heredoc avec quelques cas d'utilisation réels. Tous les exemples de cet article sont créés pour être simples, de sorte que même un débutant peut facilement comprendre ce concept. Allons-y et commençons à jouer avec heredoc dans Bash.

Syntaxe HereDoc

Le diagramme suivant illustre la syntaxe de heredoc.

Ici,

  • Commande - Toute commande (cat, wc, mail, etc.) qui accepte la redirection.
  • Opérateur de redirection (<< ) - L'opérateur par défaut pour HereDoc est << . Il redirige le bloc de code vers la commande pour traitement.
  • Jeton de délimitation - Le jeton délimiteur indique le début et la fin du document (bloc de code). Le jeton de délimitation peut être n'importe quoi mais il doit être identique. Généralement, vous verrez EOF est utilisé comme jetons de délimitation qui signifient "End Of File Stream".

Imprimer une chaîne multiligne à l'aide de HereDoc dans Bash

Commençons par un exemple simple de redirection d'une chaîne multiligne et de son impression sur le terminal.

Le cat La commande accepte un flux d'entrées et avec heredoc, et vous pouvez rediriger le bloc de code pour l'imprimer sur le terminal.

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

Sortie :

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

Jetez un oeil à l'extrait de code ci-dessus. J'ai trois lignes qui sont redirigées vers le cat commande. J'utilise EOF comme délimiteur. Cependant, vous pouvez utiliser n'importe quoi comme vous le souhaitez, mais gardez le délimiteur de début et de fin identique.

Essayons avec un autre exemple simple. Je redirige les mêmes trois lignes vers le nombre de mots programme. J'utilise un délimiteur différent (BLK ) ici.

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

Exemple de résultat :

3

Redirection et pipe dans HereDoc

Vous pouvez combiner l'opérateur de redirection de sortie avec heredoc et rediriger la sortie vers un fichier au lieu de l'imprimer sur le terminal.

J'utilise le même exemple que celui que j'ai utilisé dans la section précédente et redirige la sortie vers un fichier nommé log_op.txt .

$ 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

La sortie de heredoc peut être envoyée au pipe opérateur pour un traitement ultérieur.

$ 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

Suppression des onglets dans HereDoc

Lorsqu'il y a des espaces blancs (tabulations) dans votre bloc de code et si vous souhaitez les supprimer, utilisez alors "-" après l'opérateur de redirection. Un point important à noter est que seules les tabulations seront supprimées, pas les espaces.

Jetez un oeil à l'exemple ci-dessous. J'ai ajouté une déclaration conditionnelle au même exemple que nous avons vu dans les sections précédentes. Les deux premières lignes de heredoc sont tabulées (4) et la troisième ligne est espacée (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

Lorsque l'extrait de code est soumis, ma sortie sera la suivante.

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

Comme vous pouvez le voir, les tabulations des lignes 1 et 2 sont supprimées, mais à la ligne 3, puisque les espaces sont utilisés, elles ne sont pas supprimées.

Extension des variables et des commandes dans HereDoc

Ce n'est pas que vous ne pouvez transmettre que des chaînes dans le bloc de code heredoc. Vous pouvez transmettre des variables définies par l'utilisateur et environnementales et exécuter des commandes dans le bloc de code.

Jetez un oeil à l'exemple ci-dessous. Dans le bloc de code, j'ai une variable définie par l'utilisateur "${AUTHOR}" , une variable d'environnement "${SHELL}" , une commande externe "whoami" .

Lorsque cet extrait est soumis, les variables et les commandes seront développées puis il sera redirigé vers le cat commande.

AUTHOR="OSTechNix"

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

Exemple de résultat :

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

Vous pouvez entourer le délimiteur de début de guillemets simples pour supprimer l'expansion dans le bloc de code. De cette façon, tout ce qui se trouve dans le bloc de code sera traité comme une chaîne littérale.

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

Exemple de résultat :

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

Commentaires multilignes avec HereDoc

Comme vous le savez peut-être déjà, Bash ne prend pas en charge les commentaires multilignes. En utilisant heredoc, vous pouvez créer des commentaires multi-lignes en redirigeant le bloc de code vers le no-op commande (: ).

Le no-op est bash intégré qui prend l'entrée et renvoie le code de sortie zéro. Vous pouvez considérer cela comme un synonyme du bash intégré "true" qui sort également du code de sortie zéro.

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

Attention : Presque tous les éditeurs de texte ont la possibilité de sélectionner plusieurs lignes et vous permettent de commenter ou de décommenter à l'aide d'une touche. Il vaut mieux s'en tenir à cette approche.

Échappement des caractères spéciaux dans HereDoc

Les blocs de code peuvent contenir des caractères spéciaux. Si vous souhaitez échapper aux caractères spéciaux, il existe plusieurs façons de le faire.

Vous pouvez entourer le délimiteur avec single ou guillemets doubles ou préfixe antislash avec le délimiteur. De cette façon, tous les caractères spéciaux seront échappés.

# 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

Au lieu d'échapper tous les caractères spéciaux, vous pouvez également échapper des caractères spéciaux particuliers dans le bloc en ajoutant une barre oblique inverse avant tout caractère spécial.

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

Exemple de résultat :

I am using the ${SHELL} shell      
karthick      

Cas d'utilisation HereDoc

Jusqu'à présent, nous avons vu la construction de base d'heredoc et son utilisation de base. Voyons maintenant quelques cas d'utilisation réels. D'après mon expérience, j'ai utilisé heredoc lorsque je travaillais avec ssh et des clients de base de données où je devais exécuter un groupe de commandes.

Exemple 1 :Exécution en tant qu'utilisateur différent dans le script

Dans certains cas, vous souhaiterez peut-être exécuter certaines parties de votre code en tant qu'utilisateur différent. Dans ce cas, vous pouvez utiliser heredoc pour rediriger les commandes à exécuter en tant qu'utilisateur différent.

Jetez un oeil à l'exemple ci-dessous. Je redirige le bloc de code vers le su commande qui basculera l'utilisateur vers "ostechnix" et créera un fichier nommé test s'il n'existe pas.

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

Exemple 2 :Utilisation de HereDoc avec DB Client

Lorsque vous souhaitez exécuter une série de commandes sur une base de données, heredoc vous sera utile.

Jetez un oeil à l'exemple ci-dessous. J'interagis avec le client MongoDB mongosh et dans l'heredoc, des commandes de bloc de code sont transmises pour créer une nouvelle base de données, une nouvelle collection et ajouter un exemple de document.

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

Vous connaissez peut-être ou non MongoDB, mais c'est très bien. Ceci est juste pour montrer comment utiliser heredoc pour interagir avec les clients db. Vous pouvez utiliser n'importe quel client de base de données comme MySQL, psql, sqlite en fonction de la base de données avec laquelle vous travaillez.

Exemple 3 :Exécuter des commandes à distance avec HereDoc et SSH

Lorsque vous souhaitez exécuter des commandes sur le serveur distant, vous pouvez utiliser heredoc en combinaison avec ssh commande. Normalement en utilisant ssh commande, vous pouvez exécuter des commandes sur le serveur distant de la manière suivante.

$ ssh [email protected] "command"

Vous devez répéter la même commande encore et encore si vous souhaitez exécuter plus de commandes dans l'hôte distant. Avec heredoc, vous pouvez regrouper toutes les commandes et les exécuter.

$ ssh -T [email protected] << EOF
Command 1...
Command 2..
.....
Command N..
EOF

Lorsque le même code doit être exécuté sur plusieurs nœuds, vous pouvez ajouter for loop avec heredoc. J'utilise le même extrait de création de fichier que celui que nous avons vu dans le premier exemple.

  • La variable de tableau "server" contient la liste des noms de serveurs.
  • La boucle For itère sur la variable tableau.
  • La commande de création de fichier est transmise à la commande SSH qui itérera et créera des fichiers sur chaque serveur. Assurez-vous d'ajouter -T flag à la commande ssh qui désactivera l'allocation de pseudo-terminal.
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

Conclusion

Heredoc est un concept important à comprendre et à utiliser dans les scripts Bash. Lorsque vous écrivez beaucoup de scripts, vous en saurez plus sur heredoc et sur les moyens de l'utiliser de manière optimale.

Si vous n'avez jamais utilisé heredoc auparavant, démarrez le terminal et essayez tous les extraits de code de l'article pour mieux comprendre.

Lire connexe :

  • Scripts bash – Variables expliquées à l'aide d'exemples
  • Scripts bash – Fonctions expliquées à l'aide d'exemples
  • La commande Bash Echo expliquée avec des exemples sous Linux
  • Scripts bash – Explication de la boucle For avec des exemples
  • Scripts bash :boucle While et Until expliquée à l'aide d'exemples

Linux
  1. Tutoriel Bash HereDoc avec exemples

  2. Tutoriel de commande cd Linux pour les débutants (8 exemples)

  3. Tutoriel de commande Linux comm pour les débutants (5 exemples)

  4. Tutoriel de commande Linux df pour les débutants (8 exemples)

  5. Tutoriel de commande de date Linux pour les débutants (8 exemples)

Tutoriel de commande Linux nl pour les débutants (7 exemples)

Tutoriel de commande Linux nm pour les débutants (10 exemples)

Tutoriel de commande Linux OD pour les débutants (6 exemples)

Tutoriel de commande Linux w pour débutants (5 exemples)

Tutoriel de commande Linux ss pour les débutants (8 exemples)

Tutoriel de script Bash pour les débutants