Encadrer une chaîne de caractères avec des guillemets a pour effet de protéger les caractères spéciaux et d'empêcher leur réinterprétation ou expansion par le shell ou par un script shell. Un caractère est << spécial >> si son interprétation a une autre signification que la chaîne elle-même, comme par exemple le caractère joker *.
bash$ ls -l [Vv]* -rw-rw-r-- 1 bozo bozo 324 Apr 2 15:05 VIEWDATA.BAT -rw-rw-r-- 1 bozo bozo 507 May 4 14:25 vartrace.sh -rw-rw-r-- 1 bozo bozo 539 Apr 14 17:11 viewdata.sh bash$ ls -l '[Vv]*' ls: [Vv]*: No such file or directory |
![]() | Certains programmes et utilitaires peuvent toujours réinterpréter ou étendre les caractères spéciaux placés dans une chaîne de caractères entre guillemets. Les guillemets permettent donc en particulier de protéger du shell les paramètres dans une ligne de commande, tout en laissant au programme appelé la possibilité de les étendre et réinterpréter.
Notez que la version sans guillemets grep [Ff]irst *.txt fonctionne avec le shell Bash, mais pas sous tcsh. |
Il est généralement conseillé de placer une chaîne de caractères entre guillemets doubles (" ") lorsqu'elle doit contenir une variable. Ça préserve tous les caractères spéciaux à l'intérieur du nom de variable, sauf $, ` (guillemet inversé), et \ (échappement). Comme $ reste interprété comme un caractère spécial, cela permet de référencer une variable entre guillemets ("$variable"), c'est-à-dire de remplacer la variable par sa valeur (voir plus haut Exemple 4-1).
Vous pouvez utiliser les guillemets doubles pour éviter la séparation de mots. [1] Un argument compris entre guillemets doubles se présente comme un seul mot, même s'il contient des espaces blancs.
variable1="une variable contenant cinq mots" COMMANDE Ceci est $variable1 # Exécute COMMANDE avec 7 arguments: # "Ceci" "est" "une" "variable" "contenant" "cinq" "mots" COMMANDE "Ceci est $variable1" # Exécute COMMANDE avec 1 argument: # "Ceci est une variable contenant cinq mots" variable2="" # Vide. COMMANDE $variable2 $variable2 $variable2 # Exécute COMMANDE sans arguments. COMMANDE "$variable2" "$variable2" "$variable2" # Exécute COMMANDE avec 3 arguments vides. COMMANDE "$variable2 $variable2 $variable2" # Exécute COMMANDE avec 1 argument (2 espaces). # Merci, S.C. |
![]() | Mettre les arguments d'une instruction echo entre doubles guillemets est seulement nécessaire lorsque la séparation de mots pose problème. |
Exemple 5-1. Afficher des variables bizarres
#!/bin/bash # weirdvars.sh: Affiche des variables bizarres. var="'(]\\{}\$\"" echo $var # '(]\{}$" echo "$var" # '(]\{}$" Ne fait pas de différence. echo IFS='\' echo $var # '(] {}$" \ convertit en espace. echo "$var" # '(]\{}$" # Exemples ci-dessus donnés par S.C. exit 0 |
Les guillemets simples (' ') opèrent de manière similaire aux guillemets doubles, mais ne permettent pas de référencer des variables, car la signification spéciale de $ est désactivée. A l'intérieur des guillemets simples, tous les caractères spéciaux autres que ' sont interprétés littéralement. Vous pouvez considérer que les guillemets simples (<< citation totale >>) sont une façon plus stricte de placer entre guillemets que les guillemets doubles (<< citation partielle >>).
![]() | Comme même le caractère d'échappement (\) obtient une interprétation littérale avec les guillemets simples, essayer d'entourer un guillemet simple avec des guillemets simples ne produira pas le résultat attendu.
|
É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.
![]() | Avec certaines commandes et utilitaires, tels que echo et sed, échapper un caractère peut avoir l'effet inverse - cela peut activer un comportement particulier pour ce caractère. |
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
<< alerte >> (sonore ou visuelle)
le caractère dont le code ASCII en octal est 0xx
Exemple 5-2. Caractères d'échappement
#!/bin/bash # escaped.sh: caractères d'échappement echo; echo echo "\v\v\v\v" # Affiche \v\v\v\v litérallement. # Utilisez l'option -e avec 'echo' pour afficher les caractèrs d'échappement. echo "======================" echo "TABULATIONS VERTICALES" echo -e "\v\v\v\v" # Affiche 4 tabulations verticales. echo "=======================" echo "GUILLEMET DOUBLE" echo -e "\042" # Affiche " (guillaume, caractère octal ASCII 42). echo "=======================" # La construction $'\X' rend l'option -e inutile. echo; echo "RETOUR CHARIOT ET SON" echo $'\n' # Retour chariot. echo $'\a' # Alerte (son). echo "=======================" echo "GUILLEMETS" # La version 2 et ultérieures de Bash permettent l'utilisation de la #+ construction $'\nnn'. # Notez que dans ce cas, '\nnn' est une valeur octale. echo $'\t \042 \t' # Guillemet (") entouré par des tabulations. # Cela fonctionne aussi avec des valeurs hexadécimales, dans une construction #+ du type $'\xhhh'. echo $'\t \x22 \t' # Guillemet (") entouré par des tabulations. # Merci, Greg Keraunen, pour nous l'avoir indiqué. # Les versions précédentes de Bash permettent '\x022'. echo "=======================" echo # Affecter des caraactères ASCII à une variable. # ---------------------------------------------- guillemet=$'\042' # " affecté à une variable. echo "$guillemet Ceci est un chaîne de caractères mise entre guillemets, $guillemet et ceci reste en dehors des guillemets." echo # Concaténer des caractères ASCII dans une variable. trois_soulignes=$'\137\137\137' # 137 est le code octal ASCII pour '_'. echo "$trois_soulignes SOULIGNE $trois_soulignes" echo ABC=$'\101\102\103\010' # 101, 102, 103 sont les codes octals de A, B, C. echo $ABC echo; echo echappe=$'\033' # 033 est le code octal pour l'échappement. echo "\"echappe\" s'affiche comme $echappe" # pas de sortie visible. echo; echo exit 0 |
Voir Exemple 35-1 pour d'autres exemples d'extensions de chaînes de caractères avec la structure $' '.
donne au guillemet sa signification littérale
echo "Bonjour" # Bonjour echo "\"Bonjour\", a-t-il dit." # "Bonjour", a-t-il dit. |
donne au dollar sa signification littérale (un nom de variable suivant un \$ ne sera pas référencé)
echo "\$variable01" # donne $variable01 |
donne à l'anti-slash sa signification littérale
echo "\\" # donne \ |
![]() | Le comportement de \ est dicté par son "auto-échappement", sa mise entre guillemets ou son apparition dans une substitution de commandes ou dans un document en ligne.
Les élements d'une chaîne de caractères affectée à une variable peuvent être échappés, mais le caractère d'échappement seul ne peut être affecté à une variable.
|
Échapper un 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 et 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 |, un caractère tube, alors il n'est pas absolument 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érences. #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. #foor\ #bar # Exemples suggérés par Stéphane Chazelas. |
[1] | Ici, la << séparation de mots >> signifie que la chaîne de caractères est divisée en un certain nombre d'arguments séparés, un par mot. |
Précédent | Sommaire | Suivant |
Types spéciaux de variables | Niveau supérieur | Sortie et code de sortie (ou d'état) |