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.