Comment utiliser Heredoc dans les scripts Shell
Ici, le document (Heredoc) est un littéral de flux d'entrée ou de fichier qui est traité comme un bloc de code spécial. Ce bloc de code sera transmis à une commande pour traitement. Heredoc est originaire des shells UNIX et peut être trouvé dans les shells Linux populaires comme sh, tcsh, ksh, bash, zsh, csh. Notamment, d'autres langages de programmation comme Perl, Ruby, PHP prennent également en charge Heredoc.
Structure d'Herdoc
Heredoc utilise 2 crochets (<<)
suivis d'un jeton délimiteur. Le même jeton délimiteur sera utilisé pour terminer le bloc de code. Tout ce qui entre dans le délimiteur est considéré comme un bloc de code.
Regardez l'exemple ci-dessous. Je redirige le bloc de code vers la commande cat. Ici, le délimiteur est défini sur « BLOCK » et terminé par le même « BLOCK ».
cat << BLOCK
Hello world
Today date is $(date +%F)
My home directory = ${HOME}
BLOCK
REMARQUE : vous devez utiliser le même jeton de délimiteur pour démarrer le bloc et terminer le bloc.
Créer des commentaires multilignes
Si vous codez actuellement en bash, vous savez peut-être que bash ne prend pas en charge par défaut les commentaires multilignes comme C ou Java. Vous pouvez utiliser HereDoc pour surmonter ce problème.
Ce n'est pas une fonctionnalité intégrée de bash prenant en charge les commentaires sur plusieurs lignes, mais juste un hack. Si vous ne redirigez heredoc vers aucune commande, l'interpréteur lira simplement le bloc de code et n'exécutera rien.
<< COMMENT
This is comment line 1
This is comment line 2
This is comment line 3
COMMENT
Gestion des espaces blancs
Par défaut, heredoc ne supprimera aucun espace blanc (tabulations, espaces). Nous pouvons remplacer ce comportement en ajoutant tiret (-)
après (<<)
suivi d'un délimiteur. Cela supprimera tous les espaces de tabulation mais les espaces blancs ne seront pas supprimés.
cat <<- BLOCK
This line has no whitespace.
This line has 2 white spaces at the beginning.
This line has a single tab.
This line has 2 tabs.
This line has 3 tabs.
BLOCK
Substitution de variables et de commandes
Heredoc accepte la substitution de variables. Les variables peuvent être des variables définies par l'utilisateur ou des variables environnementales.
TODAY=$(date +%F)
cat << BLOCK1
User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1
De même, vous pouvez exécuter n'importe quelle commande à l'intérieur du bloc de code heredoc.
cat << BLOCK2
$(uname -a)
BLOCK2
Échapper aux caractères spéciaux
Il existe plusieurs façons d’échapper aux caractères spéciaux. Soit vous pouvez le faire au niveau du personnage, soit au niveau de la documentation.
Pour échapper des caractères spéciaux individuels, utilisez une barre oblique inverse (\).
cat << BLOCK4
$(uname -a)
BLOCK4
cat << BLOCK5
Today date is = ${TODAY}
BLOCK5
Pour échapper à tous les caractères spéciaux à l'intérieur du bloc, entourez le délimiteur de guillemets simples, de guillemets doubles ou le délimiteur de préfixe avec une barre oblique inverse.
cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1
cat << "BLOCK2"
I am running as = ${USER}
BLOCK2
cat << \BLOCK3
I am running as = ${USER}
BLOCK3
Maintenant que nous connaissons la structure de heredoc et comment il fonctionne, voyons quelques exemples. Deux domaines communs dans lesquels j'utilise heredoc sont l'exécution d'un bloc de commandes via SSH et la transmission de requêtes SQL via heredoc.
Dans l'exemple ci-dessous, nous essayons d'exécuter un bloc de code sur un serveur distant via SSH.
Dans l'exemple ci-dessous, je transmets une instruction select à psql pour me connecter à une base de données et exécuter la requête. Il s'agit d'une autre façon d'exécuter une requête dans psql dans un script bash au lieu d'utiliser l'indicateur -f
pour exécuter le fichier .sql.
#!/usr/bin/env bash
UNAME=postgres
DBNAME=testing
psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES
WHERE region_id = 4;
BLOCK
C'est tout pour cet article. Vous pouvez faire beaucoup plus avec heredoc par rapport à ce que nous avons montré dans les exemples. Si vous avez un hack utile avec heredoc, veuillez le publier dans la section commentaires afin que nos lecteurs puissent en bénéficier.