Comment utiliser Heredoc dans Shell Scripting

Comment utiliser Heredoc dans Shell Scripting

Ici document (Heredoc) est un littéral d'entrée ou de flux de fichiers qui est traité comme un bloc de code spécial. Ce bloc de code sera transmis à une commande pour le traitement. Heredoc originaire de Unix coquilles et peut être trouvée dans des coques Linux populaires comme SH, TCSH, KSH, BASH, ZSH, CSH. Notamment, d'autres langages de programmation comme Perl, Ruby, PHP soutiennent également Heredoc.

Structure de Herdoc

Heredoc utilise 2 supports d'angle (<<) suivi par un jeton de délimiteur. Le même jeton Delimiter sera utilisé pour terminer le bloc de code. Tout ce qui vient 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 «BLOC"Et terminé par le même"BLOC".

chat << BLOC Bonjour world aujourd'hui date est $ (date +% f) mon répertoire d'origine = $ home BLOC 

NOTE: Vous devez utiliser le même jeton Delimiter pour démarrer le bloc et terminer le bloc.

Créer des commentaires multilignes

Si vous codiez maintenant dans Bash, vous savez peut-être que Bash par défaut ne prend pas en charge les commentaires multilines comme C ou Java. Vous pouvez utiliser Heredoc pour surmonter cela.

Ce n'est pas une fonctionnalité intégrée de Bash supportant des commentaires multi-lignes, mais juste un piratage. Si vous ne redirigez pas heredoc À n'importe quelle commande, l'interprète lira simplement le bloc de code et ne s'exécutera rien.

<< COMMENTAIRE Ceci est la ligne de commentaire 1 Ceci est la ligne de commentaire 2 Ceci est la ligne de commentaire 3 COMMENTAIRE 
Commentaires multilines

Manipulation des espaces blancs

Par défaut, heredoc ne supprimera pas aucun caractères d'espace blanc (onglets, espaces). Nous pouvons remplacer ce comportement en ajoutant se précipiter (-) après (<<) suivi d'un délimiteur. Cela supprimera tous les espaces d'onglet mais les espaces blancs ne seront pas supprimés.

chat <<- 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 
Espaces de manutention

Substitution variable et de commande

Heredoc accepte la substitution variable. Les variables peuvent être des variables définies par l'utilisateur ou des variables environnementales.

Aujourd'hui = $ (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 toutes les commandes à l'intérieur du heredoc bloc de code.

chat << BLOCK2 $(uname -a) BLOCK2 
Substitution variable et de commande

Échapper aux caractères spéciaux

Il y a plusieurs façons d'échapper aux caractères spéciaux. Soit vous pouvez le faire au niveau du caractère ou au niveau du document.

Pour échapper aux caractères spéciaux individuels, utilisez un bombardement (\).

chat << BLOCK4 $(uname -a) BLOCK4 cat << BLOCK5 Today date is = $TODAY BLOCK5 

Pour échapper à tous les caractères spéciaux à l'intérieur du bloc entoure le délimiteur de citations simples, de citations doubles ou de délimiteur de préfixe avec une barre oblique inverse.

chat << 'BLOCK1' I am running as = $USER BLOCK1 cat << "BLOCK2" I am running as = $USER BLOCK2 cat << \BLOCK3 I am running as = $USER BLOCK3 
Échapper aux caractères spéciaux

Maintenant que nous connaissons la structure de heredoc Et comment ça marche, voyons quelques exemples. Deux zones communes où j'utilise heredoc exécutent un bloc de commandes sur SSH et passent des requêtes SQL à travers heredoc.

Dans l'exemple ci-dessous, nous essayons d'exécuter un bloc de code dans un serveur distant via SSH.

Commandes en cours d'exécution sur SSH

Dans l'exemple ci-dessous, je passe un sélectionner déclaration PSQL Pour se connecter à une base de données et exécuter la requête. Ceci est un autre moyen d'exécuter une requête en PSQL Script intérieur bash au lieu d'utiliser le -F drapeau pour courir .SQL déposer.

#!/ usr / bin / env bash uname = postgres dbname = tester psql --username = $ uname --word - dbname = $ dbname << BLOCK SELECT * FROM COUNTRIES WHERE region_id = 4; BLOCK 
Exécution de la requête SQL

C'est tout pour cet article. Il y a beaucoup plus que vous pouvez faire avec heredoc par rapport à ce que nous avons montré dans les exemples. Si vous avez un piratage utile avec heredoc Veuillez le publier dans la section des commentaires afin que nos lecteurs puissent en bénéficier.