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