Échapper est une méthode pour mettre entre guillemets un caractère seul. L'échappement (\) précédant un caractère dit au shell d'interpréter le caractère littéralement.
Significations spéciales des caractères échappés
passe à la ligne
renvoie le curseur en début de ligne
tabulation
tabulation verticale
retour en arrière
signifie alerte (sonore ou visuelle)
Transcode en octal le caractère dont le code ASCII est 0nn, dans lequel nn est une suite de chiffres.
Voir l'Exemple 34.1, « Expansion de chaîne de caractères » pour un autre exemple d'expansion de chaînes avec la syntaxe $' ... '.
rend au guillemet sa signification littérale
echo "Bonjour" # Bonjour echo "\"Bonjour\" ..., dit-il." # "Bonjour" ..., dit-il.
rend au dollar sa signification littérale (un nom de variable suivant un \$ ne sera pas référencé)
echo "\$variable01" # $variable01 echo "Ce livre coûte \$7.98." # Ce livre coûte $7.98.
donne à l'antislash sa signification littérale
echo "\\" # donne \ # Alors que... echo "\" # Appelle une deuxième invite de la ligne de commande. # Dans un script, donne un message d'erreur. # Cependant... echo '\' # Donne \
Le comportement de \ varie suivant s'il est « auto-échappé », fortement protégé c'est-à-dire entre apostrophes ou "guillemets simples", faiblement protégé c'est-à-dire entre guillemets doubles (""), s'il apparaît dans une substitution de commande ou dans un document en ligne. A VERIFIER
# Simple échappement et mise entre guillemets echo \z # z echo \\z # \z echo '\z' # \z echo '\\z' # \\z echo "\z" # \z echo "\\z" # \z # Substitution de commandes echo `echo \z` # z echo `echo \\z` # z echo `echo \\\z` # \z echo `echo \\\\z` # \z echo `echo \\\\\\z` # \z echo `echo \\\\\\\z` # \\z echo `echo "\z"` # \z echo `echo "\\z"` # \z # Document en ligne cat <<EOF \z EOF # \z cat <<EOF \\z EOF # \z # Ces exemples ont été donnés par Stéphane Chazelas.
Les éléments d'une chaîne de caractères affectée à une variable peuvent être échappés, mais le caractère d'échappement seul ne devrait pas être affecté à une variable.
variable=\ echo "$variable" # Ne fonctionne pas et donne le message d'erreur : # test.sh: : command not found # Un échappement seul ne peut être affecté correctement à une variable. # # Ce qui arrive ici est que "\" échappe le saut de ligne et #+ l'effet est variable=echo "$variable" #+ affectation invalide de variable variable=\ 23skidoo echo "$variable" # 23skidoo # Ça fonctionne car la deuxième ligne est une affectation #+ valide de variable. variable=\ # \^ échappement suivi d'une espace echo "$variable" # espace variable=\\ echo "$variable" # \ variable=\\\ echo "$variable" # Ne fonctionnera pas et donne le message d'erreur : # test.sh: \: command not found # # La première séquence d'échappement échappe la deuxième, mais la troisième est laissée #+ seule avec le même résultat que dans le premier exemple ci-dessus. variable=\\\\ echo "$variable" # \\ # Deuxième et quatrième séquences d'échappement # Ça marche.
Échapper une espace peut empêcher la séparation de mots dans une liste d'arguments pour une commande.
liste_fichiers="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7" # Liste de fichiers comme argument(s) d'une commande. # On demande de tout lister, avec deux fichiers en plus. ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list echo "-------------------------------------------------------------------------" # Qu'arrive-t'il si nous échappons un ensemble d'espaces ? ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list # Erreur: les trois premiers fichiers sont concaténés en un seul argument pour 'ls -l' # parce que les deux espaces échappés empêchent la séparation des arguments (mots).
L'échappement permet également d'écrire une commande sur plusieurs lignes. Normalement, chaque ligne séparée constitue une commande différente mais un échappement à la fin d'une ligne échappe le caractère de saut de ligne, et la séquence de la commande continue sur la ligne suivante.
(cd /source/repertoire && tar cf - . ) | \ (cd /dest/repertoire && tar xpvf -) # Répétant la commande de copie de répertoires d'Alan Cox, mais séparée en deux lignes # pour accroître la lisibilité. # Comme alternative : tar cf - -C /source/directory . | tar xpvf - -C /dest/directory # Voir note ci-dessous. # (Merci à Stéphane Chazelas.)
Si la ligne d'un script termine avec un |, le caractère tube, alors il n'est pas strictement nécessaire de mettre un échappement \. Il est néanmoins considéré comme une bonne pratique de programmation de toujours échapper une ligne de code qui continue sur la ligne suivante.
echo "foo bar" #foo #bar echo echo 'foo bar' # Pas encore de différence. #foo #bar echo echo foo\ bar # Saut de ligne échappé. #foobar echo echo "foo\ bar" # Pareil ici, car \ toujours interpreté comme un échappement à l'intérieur de # guillemets faibles. #foobar echo echo 'foo\ bar' # Le caractère d'échappement \ est pris littéralement à cause des guillemets forts. #foo\ #bar # Exemples suggérés par Stéphane Chazelas.