VII. Neutralisation des métacaractères▲
Certains caractères alphanumériques du Shell ont une signification particulière.
Exemple
Essayer de faire afficher tel quel à l'écran le texte encadré ci?dessous :
* (une étoile)
Il a crié "assez"; mais cela ne suffisait pas
L'habit à $100 ne fait pas le moine
A > 0 <=> A + B > B
Les problèmes rencontrés pour afficher ces quelques lignes proviennent des caractères étoile, parenthèse ouvrante, parenthèse fermante, guillemet, point-virgule, dollar, apostrophe, backslash, inférieur et supérieur qui ont une signification spéciale en Shell. On les appelle « métacaractères » (méta en grec signifie « transformer ») parce que le Shell les transforme avant de les traiter. Afin de les utiliser tels quels par le langage, on est obligé d'y appliquer un « mécanisme de neutralisation de transformation ». C'est-à-dire qu'il faut demander au Shell de ne pas les transformer en autre chose que ce qu'ils sont.
VII-A. Rappel sur les métacaractères▲
Les métacaractères suivants sont utilisés lorsque l'on désire référencer un fichier sans connaître exactement son nom :
métacaractère |
Signification |
* |
Toute chaîne de caractère, même une chaîne vide |
? |
Un caractère quelconque, mais présent |
[xyz] |
Tout caractère correspondant à l'un de ceux contenus dans les crochets |
[x-y] |
Tout caractère compris entre « x » et « y » |
[!x-y] |
Tout caractère qui n'est pas compris entre « x » et « y » |
Les métacaractères suivants sont utilisés dans le Shell :
métacaractère |
Signification |
$ |
Contenu d'une variable |
" " |
Neutralisation de certains métacaractères placés à l'intérieur |
' ' |
Neutralisation de tous les métacaractères placés à l'intérieur |
\ |
Neutralisation de tout métacaractère placé après |
( ) |
Groupement de commandes |
; |
Séparateur de commande (permet d'en placer plusieurs sur une ligne) |
< |
Redirection en entrée à partir d'un fichier |
<< |
Redirection en entrée à partir des lignes suivantes |
> |
Redirection en sortie vers un fichier |
>> |
Redirection en sortie vers un fichier en mode « ajout » |
| |
Redirection vers une commande (pipe mémoire) |
VII-B. Le « backslash »▲
Le métacaractère « backslash » a pour effet de neutraliser tout métacaractère qui le suit, quel qu'il soit. Mais il n'en neutralise qu'un seul.
Exemple
Solution avec le métacaractère « backslash » :
Prompt>
echo \* \(une étoile\)
Prompt>
echo Il a crié \"assez\"\; mais cela ne suffisait pas
Prompt> echo L\'habit à \$100 ne fait pas le moine
Prompt> echo A et B \> 0 \<=\> A + B \> B
VII-C. L'apostrophe ou « quote simple »▲
Le métacaractère « apostrophe » appelé aussi « quote simple » a pour effet de neutraliser tous les métacaractères situés après, sauf lui-même. Cette exception permet ainsi d'avoir un début et une fin de zone de neutralisation.
Mais on ne peut pas, avec cette option, neutraliser le métacaractère « apostrophe » puisqu'il marque la fin de la zone. Et le métacaractère « backslash » qui pourrait résoudre cet inconvénient ne fonctionnera pas puisqu'il sera lui-même neutralisé.
Exemple
Solution avec le métacaractère « quote simple » :
Prompt>
echo '* (une étoile)'
Prompt>
echo 'Il a crié "assez"; mais cela ne suffisait pas'
Prompt>
# Impossible d'afficher la troisième ligne avec la quote simple
Prompt>
echo 'A et B > 0 <=> A + B > B'
VII-D. Le double-guillemet ou « double-quote »▲
Le métacaractère « double-guillemet » a pour effet de neutraliser tous les métacaractères situés après, sauf le métacaractère « dollar » (qui permet d'accéder au contenu d'une variable), le métacaractère « accent grave » (qui permet la sous-exécution), le métacaractère « double-guillemet » (qui permet de marquer la fin de la zone de neutralisation), et le métacaractère « backslash » s'il est suivi d'un métacaractère de la liste ci-dessus (ce qui permet donc de neutraliser ledit métacaractère). On peut donc, avec cette option, neutraliser le métacaractère « double-guillemet » puisqu'il fait partie de la liste ; donc qu'il est neutralisable par le métacaractère « backslash ».
Exemple
Solution avec le métacaractère « double-guillemet » :
Prompt>
echo "* (une étoile)"
Prompt>
echo "Il a crié \"assez\"; mais cela ne suffisait pas"
Prompt>
echo "L'habit à \$100 ne fait pas le moine"
Prompt>
echo "A et B > 0 <=> A + B > B"