Objectifs
- Comprendre la différence cruciale entre les guillemets simples (
'...') et doubles ("..."). - Savoir quand utiliser chaque type de guillemet pour éviter les erreurs.
- Utiliser le backslash (
\) pour “échapper” un caractère spécial. - Découvrir la syntaxe
$'...'pour interpréter les caractères comme\nou\t.
Explications détaillées
Notions clés
En Bash, la manière dont vous entourez une chaîne de caractères change radicalement son interprétation. C’est l’un des concepts les plus importants pour écrire des scripts robustes.
Guillemets Doubles (`”…”) - “Weak Quoting”
Les guillemets doubles sont les plus courants. Ils protègent la plupart des caractères spéciaux, mais en laissent passer trois très importants :
- Le dollar
$pour l’expansion des variables ($USER). - Les backticks
`pour la substitution de commandes (obsolète, préférez$(...)). - Le backslash
\pour l’échappement.
En résumé, à l’intérieur de "... ", les variables sont remplacées par leur valeur.
Guillemets Simples ('...') - “Strong Quoting”
Les guillemets simples sont beaucoup plus stricts. Absolument rien n’est interprété à l’intérieur. Tout est traité littéralement.
C’est parfait quand vous voulez afficher du texte qui contient des $ ou d’autres caractères spéciaux, sans que le shell n’essaie de les interpréter.
Backslash (\) - Échappement
Le backslash annule la signification spéciale du caractère qui le suit immédiatement.
echo "Le prix est de 10\$": AfficheLe prix est de 10$sans essayer d’interpréter$.echo Un\ fichier\ avec\ des\ espaces: Permet d’inclure des espaces dans un seul argument.
Quoting ANSI-C ($\'...')
Cette forme un peu plus rare permet d’interpréter les séquences d’échappement de style C, comme :
\n: nouvelle ligne\t: tabulation\xHH: un caractère par son code hexadécimal
Syntaxe / Usages
# Les guillemets doubles interprètent les variables
NOM="Alice"
echo "Bonjour, $NOM !"
# -> Bonjour, Alice !
# Les guillemets simples traitent tout littéralement
echo 'Bonjour, $NOM !'
# -> Bonjour, $NOM !
# Échapper un caractère spécial
echo "Ce texte contient des guillemets \"double\"."
# -> Ce texte contient des guillemets "double".
# Utiliser l'échappement pour un nom de fichier avec espace
touch un\ fichier.txt
# Utiliser les guillemets, ce qui est plus lisible
touch "un autre fichier.txt"
# Afficher du texte sur plusieurs lignes
echo $"Première ligne\nDeuxième ligne"
Exemples
# Définissons une variable
FICHIERS_A_TRAITER="*.csv"
# 1. Sans guillemets : le shell étend '*' (globbing)
# Si des fichiers .csv existent, il les listera. Sinon, il affichera *.csv
echo $FICHIERS_A_TRAITER
# 2. Avec guillemets doubles : la variable est remplacée, mais pas de globbing
echo "$FICHIERS_A_TRAITER"
# -> *.csv
# 3. Avec guillemets simples : tout est littéral
echo '$FICHIERS_A_TRAITER'
# -> $FICHIERS_A_TRAITER
# 4. Un cas concret de bug
MESSAGE="Le fichier est prêt"
# La commande 'grep' cherche 'Le', et 'fichier est prêt' est vu comme un nom de fichier
grep $MESSAGE mes_logs.txt # Risqué !
# La bonne façon, qui cherche la phrase exacte
grep "$MESSAGE" mes_logs.txt
Bonnes pratiques
- La règle d’or : toujours mettre les variables entre guillemets doubles (
"$VAR"). Cela vous sauvera d’innombrables bugs liés aux espaces et aux caractères spéciaux. - Utilisez les guillemets simples
'...'quand vous voulez être sûr que rien ne sera interprété. - Préférez les guillemets pour gérer les espaces dans les noms de fichiers (
"mon fichier") plutôt que les backslashs (mon\ fichier), c’est plus lisible.
Pièges courants
- Oublier les guillemets pour une variable :
rm $FICHIERoù$FICHIERcontient"mon rapport important.txt"devientrm mon rapport important.txt. Catastrophe. - Essayer de mettre une apostrophe dans une chaîne avec guillemets simples : Ce n’est pas possible directement. Il faut fermer les guillemets, échapper l’apostrophe, puis les rouvrir :
'Ceci est l\'apostrophe'. C’est complexe,echo "C'est plus simple"est souvent mieux. - Penser que
echoest toujours sûr : Si une variable peut commencer par-,echo $VARpeut être interprété commeecho -n, ce qui change son comportement.printf "%s\n" "$VAR"est l’alternative la plus robuste.
Exercices
-
Comparer les guillemets :
- Déclarez une variable
PLANETE="Terre". - Exécutez
echo "Bienvenue sur $PLANETE" - Exécutez
echo 'Bienvenue sur $PLANETE' - Notez la différence.
- Déclarez une variable
-
Gérer les espaces :
- Créez un dossier dont le nom est “Mes Documents Importants” en utilisant des guillemets.
- Listez son contenu avec
ls. - Supprimez-le.
-
Script avec arguments :
- Créez un script
afficher.shqui prend un argument et l’affiche, précédé de “Message : ”. - Exécutez-le avec le message
"Ceci est un test !". - Exécutez-le avec le message
Le dossier est $HOME. Observez ce qui se passe avec et sans guillemets dans le script.
- Créez un script