Recherche de site Web

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.