Aller au contenu
English
English
Administration Linux medium

Expansions du shell

30 min de lecture

Quand vous tapez ls *.txt, le shell remplace *.txt par la liste des fichiers correspondants avant de lancer ls. C'est une expansion : le shell transforme ce que vous écrivez en quelque chose de plus précis. Comprendre ces mécanismes permet d'écrire des commandes courtes et puissantes au lieu de répéter les mêmes opérations à la main.

  • Utiliser les jokers (*, ?, [...]) pour cibler des fichiers
  • Générer des séquences avec les accolades {a,b} et {1..5}
  • Utiliser le tilde ~ comme raccourci vers le répertoire personnel
  • Injecter le résultat d'une commande avec $()
  • Faire un calcul simple avec $(())
  • Choisir entre guillemets simples et doubles

Le globbing (expansion de motifs) est le mécanisme le plus utilisé. Le shell remplace les motifs par la liste des fichiers qui correspondent.

Fenêtre de terminal
ls *.txt

Affiche tous les fichiers qui se terminent par .txt dans le répertoire courant.

Fenêtre de terminal
ls rapport*

Affiche tous les fichiers dont le nom commence par rapport.

Le point d'interrogation ?, exactement un caractère

Section intitulée « Le point d'interrogation ?, exactement un caractère »
Fenêtre de terminal
ls fichier?.txt

Correspond à fichier1.txt, fichierA.txt, mais pas à fichier12.txt (deux caractères après fichier).

Fenêtre de terminal
ls fichier[123].txt

Correspond à fichier1.txt, fichier2.txt, fichier3.txt.

Vous pouvez aussi utiliser un intervalle :

Fenêtre de terminal
ls fichier[a-z].txt

Correspond à fichiera.txt, fichierb.txt, etc.

Fenêtre de terminal
ls /var/log/*.log
ls /etc/*.d/
ls *.{txt,md}

Pour voir ce que le shell va étendre, utilisez echo au lieu de la commande réelle :

Fenêtre de terminal
echo *.txt

Le shell affiche la liste des fichiers correspondants sans rien exécuter.

Les accolades {} permettent de générer une liste de valeurs. Contrairement au globbing, les accolades ne dépendent pas des fichiers existants.

La forme la plus simple énumère les valeurs entre accolades, séparées par des virgules et sans espace. Le shell produit alors autant d'arguments qu'il y a d'éléments, et cette expansion a lieu avant l'exécution de la commande.

Fenêtre de terminal
echo {rouge,vert,bleu}
Résultat
rouge vert bleu

Utile pour créer plusieurs dossiers d'un coup :

Fenêtre de terminal
mkdir -p projet/{src,docs,tests}

Crée trois sous-dossiers dans projet/.

Les deux points entre deux nombres engendrent l'intervalle complet, bornes comprises. C'est la forme qui sert à créer des fichiers ou des répertoires numérotés en une seule commande, sans écrire de boucle.

Fenêtre de terminal
echo {1..5}
Résultat
1 2 3 4 5
Fenêtre de terminal
touch fichier{01..10}.txt

Crée fichier01.txt à fichier10.txt.

Le même mécanisme fonctionne sur les lettres, dans l'ordre alphabétique. L'intérêt est identique : engendrer une série de noms qui n'existent pas encore, ce que le globbing ne sait pas faire puisqu'il part des fichiers présents.

Fenêtre de terminal
echo {a..f}
Résultat
a b c d e f

Le caractère ~ est remplacé par le chemin de votre répertoire personnel :

Fenêtre de terminal
echo ~
Résultat
/home/bob

~/Documents équivaut à /home/bob/Documents.

Le tilde accepte aussi un nom de compte accolé : ~alice désigne le répertoire personnel d'Alice, soit /home/alice, à condition que le compte existe sur la machine. Dans le cas contraire, le shell laisse la chaîne telle quelle, ce qui produit un chemin littéral ~alice et une erreur de fichier introuvable.

La syntaxe $(commande) exécute la commande entre parenthèses et remplace le tout par sa sortie :

Fenêtre de terminal
echo "Nous sommes le $(date +%d/%m/%Y)"
Résultat
Nous sommes le 06/04/2026

Autre exemple, stocker le résultat dans une variable :

Fenêtre de terminal
NB_FICHIERS=$(ls | wc -l)
echo "Il y a $NB_FICHIERS fichiers ici"

La substitution de commande est très utile dans les scripts pour capturer dynamiquement des informations.

Bash sait calculer sans appeler de programme externe, à une condition : il ne manipule que des entiers. Une division rend donc un quotient entier, $((7 / 2)) valant 3 et non 3,5, et il n'existe pas de nombre à virgule. Pour un calcul décimal, il faut passer par un outil comme bc ou awk.

Pour faire un calcul entier :

Fenêtre de terminal
echo $((3 + 7))
Résultat
10

Opérateurs disponibles : +, -, *, / (division entière), % (modulo).

Fenêtre de terminal
TOTAL=$((512 * 1024))
echo "$TOTAL octets"

Le choix des guillemets détermine si le shell interprète ou non les variables et les expansions.

Fenêtre de terminal
NOM="Alice"
echo "Bonjour $NOM"
Résultat
Bonjour Alice

Les expansions $NOM, $(commande) et $((calcul)) sont interprétées.

Guillemets simples '...', le shell n'interprète rien

Section intitulée « Guillemets simples '...', le shell n'interprète rien »

Les guillemets simples désactivent toute expansion : variables, substitutions de commande et calculs sont transmis tels quels. Ce sont donc eux qu'il faut employer pour un texte littéral, une expression régulière, ou un mot de passe contenant un $.

Fenêtre de terminal
echo 'Bonjour $NOM'
Résultat
Bonjour $NOM

Le texte est pris littéralement.

SituationGuillemets
Texte avec variables à remplacer"..."
Texte littéral sans remplacement'...'
Commande avec espaces dans un chemin"..."

Une habitude à prendre dès maintenant : entourez systématiquement vos variables de guillemets doubles, sous la forme "$MA_VAR". Sans eux, un espace présent dans la valeur est lu comme un séparateur d'arguments, et une commande qui devait recevoir un nom de fichier en reçoit deux. Le défaut ne se voit qu'avec des valeurs qui contiennent un espace, donc jamais pendant les tests.

Ces 5 symptômes ont une racine commune : l'expansion a lieu dans le shell, avant que la commande ne s'exécute. Le message d'erreur vient donc de la commande, qui a reçu autre chose que ce que vous pensiez lui donner, et ne parle jamais de l'expansion elle-même. En cas de doute, remplacez la commande par echo pour voir ce qu'elle aurait reçu.

SymptômeCause probableSolution
ls *.txt affiche « No matches found »Aucun fichier .txt dans le répertoireVérifier avec ls puis ajuster le motif
mkdir {a,b,c} crée un seul dossier {a,b,c}Espace après la virgule ou guillemets simples autourÉcrire {a,b,c} sans espaces et sans '...'
$NOM affiche le texte littéralVariable entourée de guillemets simples '...'Utiliser des guillemets doubles "..."
$(commande) ne fonctionne pasParenthèses incorrectes ou commande inexistanteVérifier la commande seule d'abord
Calcul retourne 0 au lieu du résultatDivision entière ou syntaxe $() au lieu de $(())Utiliser $(( )) avec doubles parenthèses

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • Le globbing (*, ?, [...]) fait correspondre des noms de fichiers existants.
  • Les accolades {a,b} et {1..5} génèrent des listes, indépendamment des fichiers.
  • ~ est le raccourci vers votre répertoire personnel.
  • $(commande) injecte le résultat d'une commande dans une autre.
  • $(()) permet les calculs entiers.
  • Les guillemets doubles "..." interprètent les variables, les simples '...' non.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn