Here document
Un Here Document, souvent appelé heredoc, document en ligne ou encore document « ici-même », est une manière de déclarer une chaîne de caractères dans les interpréteurs de commandes comme les shells Unix (sh, ksh, csh, bash, zsh) et dans les langages de programmation ou de script comme Perl, PHP, Python, Ruby et JCL. Il conserve tous les sauts de lignes et espaces dans le texte, indentation comprise. Certains langages permettent l'interprétation de variable dans la chaîne.
La syntaxe la plus courante consiste en une paire de chevrons <<
suivie d'un délimiteur : une chaîne de caractères alphanumériques, suivi sur la ligne suivante de la première ligne du heredoc, clos à la fin par le délimiteur, la même chaîne de caractère, sur sa propre ligne.
Si la paire de chevrons est immédiatement suivie d'un tiret <<-
les tabulations et espaces en début de ligne du heredoc seront éliminées lors de l'interprétation de la commande. Ceci permet d'indenter le contenu du heredoc par rapport au reste du script et d'en assurer une meilleure lisibilité.
Exemples
[modifier | modifier le code]Shell Unix
[modifier | modifier le code]On passe ici un heredoc dans l'entrée standard de la commande tr du shell Unix, dans le but de mettre en majuscule toutes les minuscules :
$ tr a-z A-Z <<LIMITE
> un deux trois quatre
> LIMITE
UN DEUX TROIS QUATRE
La chaîne LIMITE
est ici utilisé comme délimiteur du heredoc. Ce dernier se trouve donc entre les deux LIMITE
et contient la chaîne un deux trois quatre
.
Les caractères >
en début de ligne sont les invites de prompt indiquant que l'édition de la ligne de commande n'est pas encore achevée.
Le retour UN DEUX TROIS QUATRE
est le résultat de la commande tr
.
Il est possible d'interpoler une variable du shell dans le heredoc ici délimité par MON_NOM
, ici la variable LOGNAME
:
cat <<MON_NOM
> Mon nom est $LOGNAME
> MON_NOM
Mon nom est jeanpierre
Il est possible aussi d'inclure un appel de commande, ici en bash :
cat <<MON_NOM
> Mon nom est $(echo $LOGNAME|tr a-z A-Z)
> MON_NOM
Mon nom est JEANPIERRE
Il est possible d'empêcher l'évaluation du contenu du heredoc en incluant le premier délimiteur entre des guillemets simples ou doubles :
cat <<"MON_NOM"
> Mon nom est $(echo $LOGNAME|tr a-z A-Z)
> MON_NOM
Mon nom est $(echo $LOGNAME|tr a-z A-Z)
PHP
[modifier | modifier le code]En PHP, on parle de heredoc. Cela permet d'y inclure des apostrophes et des guillemets dans une chaine de caractères sans les échapper.
<?php
$name = "Joe Smith";
$occupation = "Programmer";
echo <<<EOF
Section heredoc.
Pour plus d'information, veuillez vous adresser à $name, votre $occupation local.
Merci !
EOF;
?>
Depuis PHP 5.3, nowdoc est aussi disponible[1]
Avant PHP 7.3, il était impératif de mettre l'identifiant de fermeture ("EOF;" ci-dessus) seul sur une nouvelle ligne (sans indentation)[2].
nowdoc
[modifier | modifier le code]La syntaxe nowdoc est une variante de heredoc consistant à ajouter des apostrophes autour du nom, et qui n’interprète pas les variables. Exemple en PHP :
echo <<<'MON_NOM_EST'
Mon nom est $LOGNAME
MON_NOM_EST
// Affiche : Mon nom est $LOGNAME