Echo
| Fiche express | |
|---|---|
| Domaine | Affichage de texte / scripting shell |
| Commande | echo
|
| Contexte | Builtin POSIX (sh) et bash, existe aussi en binaire externe (/bin/echo)
|
| Voir aussi | Printf (formatage plus fiable) |
echo affiche du texte sur la sortie standard. C'est l'une des commandes les plus utilisées dans les scripts shell, mais son comportement exact (interprétation des échappements, retour à la ligne final) varie selon l'implémentation utilisée — builtin bash, builtin sh POSIX ou binaire /bin/echo — ce qui explique une partie des surprises qu'on peut rencontrer d'un système à l'autre.
Syntaxe de base
echo "Hello world"
echo Hello world # les guillemets ne sont pas obligatoires si pas d'espaces à préserver
Interpréter les échappements avec -e
Par défaut, echo affiche les séquences comme \n ou \t telles quelles, sans les interpréter. L'option -e active leur interprétation :
echo -e "paul\nmarcel"
affiche bien deux lignes (paul puis marcel) au lieu d'une seule ligne contenant littéralement \n.
⚠️ Ce comportement par défaut de -e n'est pas garanti partout : le builtin bash exige -e pour interpréter les échappements, mais le builtin sh POSIX (et donc bash lancé en mode sh) peut les interpréter sans avoir besoin de -e, voire l'afficher tel quel selon les options. C'est cette même ambiguïté qui explique la remarque classique « sous AIX, -e n'est pas nécessaire » : sur cette plateforme, echo interprète les échappements par défaut, contrairement au builtin bash usuel sous Linux. Mieux vaut donc tester le comportement réel sur le système visé plutôt que de le supposer, ou utiliser printf qui a un comportement portable et prévisible (voir Printf).
Supprimer le retour à la ligne final avec -n
Par défaut, echo ajoute un retour à la ligne après le texte affiché. L'option -n le supprime :
echo -n "Chargement en cours... "
Utile pour construire un affichage progressif sur une même ligne (barre de progression, invite personnalisée, etc.), ou pour capturer une valeur sans retour à la ligne parasite dans une variable.
Mettre en couleur le shell
Les terminaux comprennent des séquences d'échappement ANSI pour changer la couleur du texte affiché. Elles s'écrivent avec le caractère ESC (\033 en octal), suivi de [, d'un code numérique, puis de m :
echo -e "\033[31mHello\033[00m"
\033[31m passe le texte en rouge, \033[00m réinitialise le style (indispensable pour ne pas colorer tout ce qui suit dans le terminal). Quelques codes courants : 30-37 pour les couleurs de texte (noir, rouge, vert, jaune, bleu, magenta, cyan, blanc), 40-47 pour les couleurs de fond, et 01 pour le gras. L'option -e reste nécessaire ici pour que \033 soit interprété comme un caractère d'échappement plutôt qu'affiché tel quel.
Citer une variable : le piège du word-splitting
echo "$var" et echo $var ne sont pas équivalents. Sans guillemets, le shell effectue d'abord le découpage en mots (word-splitting sur les espaces/tabulations/retours à la ligne de $IFS) et l'expansion des globs, avant de passer le résultat à echo :
var="deux mots"
echo "$var" # affiche : deux mots (espaces préservés)
echo $var # affiche : deux mots (espaces multiples réduits à un seul)
Le problème est plus visible encore si la variable contient un caractère générique ou plusieurs mots destinés à rester ensemble : sans guillemets, un espace imprévu peut faire éclater la valeur en plusieurs arguments, et un caractère comme * peut être développé en liste de fichiers du répertoire courant. Par réflexe, toujours citer une expansion de variable ("$var") sauf besoin explicite et maîtrisé du découpage.
Voir aussi
- Printf — alternative plus prévisible que
echopour un formatage complexe (pas d'ambiguïté sur l'interprétation des échappements ni sur le retour à la ligne)