Guide complet sur les structures spéciales, les variables et les expansions Bash

Aperçu

Cet article présente de manière systématique toutes les structures spéciales, variables, expansions et structures de contrôle utilisées dans le shell Bash.


À propos des notations de variables

Les valeurs dynamiques ou dépendantes de l’environnement sont notées sous la forme <<nom_variable>>, et chaque cas d’utilisation est clairement illustré.

Nom de variable Exemple Description
<<var>> name, path, user Nom de variable arbitraire
<<default>> guest, 8080 Valeur par défaut ou alternative
<<pattern>> *.txt, */ Motif de fichier ou de chaîne
<<offset>> 0, 3 Position de départ (index 0)
<<length>> 4, 10 Longueur de sous-chaîne
<<prefix>> ENV_, HOST Préfixe du nom de variable
<<index>> 0, 1, 2 Index de tableau ou clé associative
<<file>> /tmp/test.txt Chemin de fichier

Étape 1 : Caractères spéciaux (Métacaractères)

Symbole Signification Exemple
* Correspond à n’importe quelle chaîne ls *.txt
? Correspond à un seul caractère ls ?.sh
[a-z] Correspondance par plage ls [A-Z]*
{a,b} Expansion de liste mv {hoge,huga}
{1..3} Expansion numérique touch file{1..3}.txt
$ Expansion de variable echo $HOME
! (négation) Négation de condition [[ ! -f test.txt ]]
! (historique) Expansion d’historique !10
~ Répertoire personnel cd ~
; Séparateur de commandes pwd; ls
&& Exécution si réussite make && echo OK
` `
& Exécution en arrière-plan sleep 5 &
` ` Tube
> Redirection de sortie echo hi > out.txt
>> Ajout de sortie echo hi >> out.txt
< Redirection d’entrée wc -l < file.txt
() Sous-shell (cd /tmp; ls)
{} Bloc dans le même shell { echo A; echo B; }
\ Échappement echo \$HOME
' ' Littéral (pas d’expansion) echo '$USER'
" " Expansion activée echo "$USER"

Étape 2 : Variables spéciales

Variable Contenu Exemple
$0 Nom du script echo $0
$1〜$9 Arguments echo $1
$@ Tous les arguments for a in "$@"; do echo $a; done
$# Nombre d’arguments echo $#
$? Code de sortie précédent ls /nope; echo $?
$$ PID du processus actuel echo $$
$! PID du dernier job en arrière-plan sleep 10 & echo $!
$- Options du shell echo $-
$_ Dernier argument de la dernière commande echo $_
$PPID PID du parent echo $PPID
$RANDOM Nombre aléatoire (0–32767) echo $RANDOM
$SECONDS Secondes depuis le début du shell echo $SECONDS
$FUNCNAME Nom de fonction myf(){ echo $FUNCNAME; }; myf
$PIPESTATUS[@] Codes de sortie dans un pipe `ls

Étape 3 : Expansion de variables

Syntaxe Signification Exemple
${<<var>>} Expansion simple name=user; echo ${name}
${<<var>>:-<<default>>} Valeur par défaut echo ${user:-guest}
${<<var>>:=<<default>>} Affecte la valeur par défaut echo ${port:=8080}
${<<var>>:+alt} Si défini, utiliser alt x=1; echo ${x:+OK}
${<<var>>:?msg} Erreur si non défini echo ${config:?config missing}
${#<<var>>} Longueur de chaîne name=user; echo ${#name}
${<<var>>%<<pattern>>} Supprime le suffixe court path=/a/b/c; echo ${path%/*}
${<<var>>%%<<pattern>>} Supprime le suffixe long echo ${path%%/*}
${<<var>>#<<pattern>>} Supprime le préfixe court echo ${path#*/}
${<<var>>##<<pattern>>} Supprime le préfixe long echo ${path##*/}
${<<var>>/<<pattern>>/<<repl>>} Remplace la première occurrence echo ${msg/foo/bar}
${<<var>>//<<pattern>>/<<repl>>} Remplace toutes les occurrences echo ${msg// /_}
${<<var>>:<<offset>>} Sous-chaîne depuis offset s=abcdef; echo ${s:2}
${<<var>>:<<offset>>:<<length>>} Sous-chaîne limitée echo ${s:1:3}
${!<<prefix>>*} Liste de variables commençant par prefix HOST1=x; echo ${!HOST*}
${!<<var>>} Référence indirecte ref=NAME; NAME=user; echo ${!ref}
${<<var>>,} / ${<<var>>^^} Conversion de casse n=abc; echo ${n^^}
${<<var>>@Q} Expansion entre guillemets x='abc'; echo ${x@Q}

Étape 4 : Tableaux et tableaux associatifs

arr=(a b c)
echo ${arr[<<index>>]}
echo ${#arr[@]}
for i in "${arr[@]}"; do echo $i; done

declare -A map
map[<<index>>]=100
map[name]=user
echo ${map[<<index>>]}
echo ${!map[@]}

Étape 5 : Expansion arithmétique

x=5
y=3
echo $((x + y))
((x *= 2))
echo $x

Étape 6 : Expressions conditionnelles

if [ "$USER" = "root" ]; then echo root; fi
if [ "$x" -lt 10 ]; then echo "petit"; fi
if [ -f /etc/passwd ]; then echo "existe"; fi
s="hello123"
[[ $s =~ [0-9]+ ]] && echo "contient un nombre"

Étape 7 : Substitution de commande et sous-shell

echo "Aujourd’hui : $(date +%Y-%m-%d)"
(cd /tmp; ls)

Étape 8 : Redirection et descripteurs de fichier

echo "Hello" > <<file>>
echo "Append" >> <<file>>
wc -l < <<file>>
ls /notfound 2> err.log
echo "OK" >&2
exec 3> custom.log
echo "via fd3" >&3
exec 3>&-

Complément : Descripteurs de fichier (FD)

FD Nom Description Exemple
0 stdin Entrée standard < file.txt
1 stdout Sortie standard echo test > out.txt
2 stderr Sortie d’erreur ls /nope 2> err.log
3+ Utilisateur Flux défini par l’utilisateur exec 3> log.txt
exec 3> process.log
echo "Début d’exécution" >&3
exec 3>&-

Étape 9 : Gestion d’erreurs et signaux

set -e
set -u
set -x
set -o pipefail
trap 'echo Fin' EXIT
trap 'echo Erreur détectée' ERR

Étape 10 : Gestion de jobs

sleep 10 &
jobs
fg %1
bg %1
disown %1
kill %1

À propos du %1

Lorsqu’une commande est exécutée en arrière-plan avec &, Bash lui attribue un numéro de job.

Symbole Signification
%1 Job numéro 1
%+ Job actuel
%- Job précédent
fg %1
bg %1
kill %1

Étape 11 : Commandes spéciales et mots réservés

:
true
false
source ~/.bashrc
eval "echo executed"
{ echo A; echo B; }

Conclusion

Ce guide couvre l’ensemble des structures spéciales, expansions, variables, symboles et contrôles de flux en Bash.
En maîtrisant ces éléments, vous pouvez analyser, concevoir et automatiser des scripts de manière sûre et réutilisable.