Retour au cours

quoting escaping

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 \n ou \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 :

  1. Le dollar $ pour l’expansion des variables ($USER).
  2. Les backticks ` pour la substitution de commandes (obsolète, préférez $(...)).
  3. 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\$" : Affiche Le 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 $FICHIER$FICHIER contient "mon rapport important.txt" devient rm 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 echo est toujours sûr : Si une variable peut commencer par -, echo $VAR peut être interprété comme echo -n, ce qui change son comportement. printf "%s\n" "$VAR" est l’alternative la plus robuste.

Exercices

  1. 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.
  2. 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.
  3. Script avec arguments :

    • Créez un script afficher.sh qui 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.