Présentation
Un document ici (HereDoc ) est une section de code qui agit comme un fichier séparé. Un HereDoc est une chaîne multiligne ou un littéral de fichier pour envoyer des flux d'entrée à d'autres commandes et programmes.
Les HereDocs sont particulièrement utiles lors de la redirection de plusieurs commandes à la fois, ce qui permet de rendre les scripts Bash plus clairs et plus faciles à comprendre.
Cet article vous apprend les bases de l'utilisation de la notation HereDoc et quelques cas d'utilisation typiques.
Prérequis
- Accès à la ligne de commande/au terminal en tant qu'utilisateur sudo.
- Un éditeur de texte pour écrire des scripts Bash.
- Commandes Linux de base. Pour une référence rapide, prenez notre aide-mémoire sur les commandes Linux.
Syntaxe Bash HereDoc
La syntaxe pour écrire un HereDoc est :
[COMMAND] <<[-] 'DELIMITER'
Line 1
Line 2
...
DELIMITER
Il se compose des éléments suivants :
COMMAND
est facultatif. Fonctionne pour toute commande qui accepte la redirection.<<
est l'opérateur de redirection pour transmettre un HereDoc à laCOMMAND
.-
est un paramètre de suppression de tabulation.DELIMITER
dans la première ligne définit un jeton de délimiteur HereDoc.END
,EOT
, etEOF
sont les plus courants, mais tout mot à plusieurs caractères qui n'apparaîtra pas dans le corps fonctionne. Omettez les guillemets simples sur la première ligne pour permettre l'expansion des commandes et des variables.- Le
DELIMITER
dans la dernière ligne indique la fin d'un HereDoc. Utilisez le même mot de la première ligne sans les espaces de début.
Le HereDoc lui-même contient n'importe quel nombre de lignes avec des chaînes, des variables, des commandes et d'autres entrées.
Exemples de Bash HereDoc
Cette section montre comment utiliser la notation HereDoc dans diverses situations. Le cas d'utilisation le plus courant est la commande cat.
Chaîne multiligne
Ouvrez le terminal et saisissez le texte suivant en appuyant sur Entrée après chaque ligne :
cat << EOF
Hello
World
EOF
Le cat
commande lit le HereDoc et écrit le contenu sur le terminal.
Extension variable
Un HereDoc accepte l'utilisation de variables et les lit.
Pour voir comment cela fonctionne, créez deux variables dans le terminal :
var1="Hello"
var2="World"
Transmettez le HereDoc à un cat
commande pour imprimer les deux variables avec une variable d'environnement :
cat << END
$var1
$var2
$PWD
END
Toutes les variables se développent et leurs valeurs respectives s'impriment sur le terminal.
Extension des commandes
HereDocs accepte la substitution de commande. Exécutez le code suivant dans le terminal ligne par ligne pour voir les résultats :
cat << EOF
$(echo Hello)
$(whoami)
EOF
Encadrez chaque commande dans $()
pour évaluer une instruction et récupérer les résultats. Omission de $()
traite le texte comme une chaîne.
Ignorer l'expansion des variables et des commandes
Ajoutez des guillemets simples ou doubles au premier délimiteur pour ignorer l'expansion des variables et des commandes dans un HereDoc.
Par exemple :
cat << "EOF"
$(echo Hello)
$(whoami)
$PWD
EOF
L'ajout de guillemets au délimiteur traite le contenu comme un littéral HereDoc.
Canalisation et redirection
Utilisez la canalisation ou la redirection pour transmettre les résultats de la commande à une autre commande. Par exemple, créez un script Bash et ajoutez le contenu suivant pour diriger une commande :
#!/bin/bash
cat << EOF | base64 -d
SGVsbG8KV29ybGQK
EOF
Vous pouvez également utiliser la notation de redirection pour obtenir le même résultat :
#!/bin/bash
(base64 -d) < cat << EOF
SGVsbG8KV29ybGQK
EOF
Exécutez le script Bash pour voir les résultats.
Dans les deux cas, la sortie du cat
et une commande HereDoc conduit (ou redirige) vers le base64 -d
commande. En conséquence, le script décode le message du HereDoc.
Écrire dans un fichier
HereDoc permet d'écrire des documents multilignes via une seule commande.
Pour créer un fichier et enregistrer le contenu HereDoc, utilisez le format suivant :
cat << EOF > hello_world.txt
Hello
World
EOF
Si le document n'existe pas, la commande le crée. Vérifiez le contenu du fichier pour confirmer :
cat hello_world.txt
La console affiche le contenu du fichier.
Suppression des tabulations
Ajoutez un tiret (-
) après la redirection pour supprimer les tabulations principales. Par exemple, créez et exécutez le script suivant :
#!/bin/bash
cat <<- EOF
Hello
World
EOF
Sans suppression de tabulation, le message s'imprime sur la console avec une indentation. L'ajout du tiret supprime le retrait de tabulation et affiche le message sans les espaces de début.
Instructions et boucles internes
Lorsque vous travaillez avec des instructions et des boucles internes HereDoc, gardez à l'esprit le comportement suivant :
- Code à l'intérieur des instructions et des boucles est en retrait. Ajoutez un tiret après l'opérateur de redirection pour imprimer les messages d'un HereDoc sans indentation.
- Le délimiteur de fin ne peut pas être précédé d'espaces ou d'indentations.
Essayez l'exemple de code suivant pour voir comment utiliser un HereDoc dans une instruction if :
#!/bin/bash
if true;
then
cat <<- "END"
Hello
World
END
fi
Le tiret garantit que les retraits n'apparaissent pas lorsque le programme s'exécute. Le délimiteur de fin n'est pas en retrait et l'ajout d'espaces provoque une erreur.
Commentaires multilignes
Un HereDoc avec la commande null (:
) crée l'effet des commentaires de bloc dans les scripts Bash.
Par exemple :
#!/bin/bash
: << 'END'
This is a comment
END
L'utilisation de la notation HereDoc comme commentaire de bloc n'est pas conventionnelle. En général, Bash ne prend pas en charge les commentaires de bloc.
Caractères d'échappement
Pour éviter l'interprétation des caractères, ajoutez une barre oblique inverse (\
) avant un caractère :
cat << EOF
\$100
EOF
Sinon, évitez complètement l'interprétation des caractères en échappant le délimiteur :
cat << \EOF
$100
EOF
L'utilisation de guillemets sur le délimiteur est équivalente dans ce cas.
Fonctions
Ajoutez des paramètres à une fonction en transmettant des informations via un HereDoc. Par exemple, créez une fonction pour lire les lignes et ajouter des informations via le HereDoc :
#!/bin/bash
readLines(){
read greeting
read name
}
readLines << EOF
Hello
$USER
EOF
echo $greeting
echo $name
La fonction stocke les informations fournies par le HereDoc dans des variables.
Exécutez le script pour imprimer les valeurs des variables sur le terminal.
HereDoc et SSH
Un HereDoc est pratique pour exécuter plusieurs commandes sur une machine distante. Transmettez un HereDoc à la connexion SSH pour exécuter plusieurs commandes.
Par exemple :
ssh [email protected] << EOF
echo "Local user: $USER"
echo "Remote user: \$USER"
EOF
La commande imprime les utilisateurs locaux et distants sur la console.
HereDoc et SFTP
SFTP permet de transférer des données en toute sécurité via le protocole SSH. Transférez un HereDoc pour exécuter automatiquement plusieurs commandes SFTP :
sftp [email protected] << EOF
put test.sh
EOF
Le code télécharge un exemple de fichier sur la machine distante.