Bash
Aide-mémoire complet du scripting Bash : variables, tests, boucles, fonctions, chaînes, redirections et bonnes pratiques.
Le squelette d'un script
#!/usr/bin/env bash
set -euo pipefail # arrêt sur erreur, variable non définie ou pipe cassé
IFS=$'\n\t' # séparateur de champs plus sûr
#!/usr/bin/env bash: le shebang (toujours en 1ʳᵉ ligne).- Rendre exécutable puis lancer :
chmod +x script.sh·./script.sh. - Un commentaire commence par
#(sauf le shebang).
Variables et paramètres
- Affecter :
var="valeur"(pas d'espace autour du=) · Lire :$varou${var}. - Par défaut les variables sont globales ; dans une fonction, préfixer avec
local. - Constante :
readonly PI=3.14.
| Variable | Contenu |
|---|---|
$0 |
nom du script |
$1, $2… |
1er, 2e argument |
$# |
nombre d'arguments |
$@ |
tous les arguments (séparés) |
$* |
tous les arguments (une chaîne) |
$? |
code de retour de la dernière commande |
$$ |
PID du script |
$! |
PID du dernier processus en arrière-plan |
Substitution et expansion
- Commande :
today=$(date +%F)(préférer$(...)aux backticks). - Arithmétique :
$(( 3 + 4 * 2 ))· incrément :(( i++ )). - Valeur par défaut :
${var:-defaut}(si vide) ·${var:=defaut}(et affecte). - Longueur :
${#var}· sous-chaîne :${var:0:3}. - Accolades :
echo fichier{1..3}.txt→fichier1.txt fichier2.txt fichier3.txt.
Tests et conditions
if [[ "$age" -ge 18 ]]; then
echo "majeur"
elif [[ -z "$age" ]]; then
echo "inconnu"
else
echo "mineur"
fi
- Préférer
[[ ... ]]à[ ... ](plus sûr, gère&&,||,<,=~). - Fichiers :
-eexiste ·-ffichier ·-ddossier ·-r/-w/-xdroits ·-snon vide. - Nombres :
-eq -ne -lt -le -gt -ge. - Chaînes :
=!=·-zvide ·-nnon vide ·=~regex. casepour les choix multiples :
case "$1" in
start) demarrer ;;
stop) arreter ;;
*) echo "usage : $0 {start|stop}" ;;
esac
Boucles
for f in *.log; do echo "$f"; done # sur des fichiers
for i in {1..5}; do echo "$i"; done # sur une plage
for ((i=0; i<5; i++)); do echo "$i"; done # style C
while read -r ligne; do echo "$ligne"; done < fichier.txt
until ping -c1 srv &>/dev/null; do sleep 2; done
breaksort de la boucle ·continuepasse au tour suivant.- Lire un fichier ligne par ligne :
while read -r ... done < fichier.
Fonctions
log() {
local niveau="$1"; shift
echo "[$(date +%T)] [$niveau] $*"
}
log INFO "démarrage"
- Les arguments d'une fonction sont
$1,$2… (indépendants de ceux du script). return Nfixe le code de retour (0 = succès) ;shiftdécale les arguments.
Manipulation de chaînes
- Majuscule / minuscule :
${var^^}·${var,,}. - Remplacer :
${var/ancien/nouveau}(1ʳᵉ occurrence) ·${var//.../...}(toutes). - Retirer un préfixe/suffixe :
${fichier%.txt}(suffixe) ·${chemin##*/}(basename). - Découper :
IFS=',' read -ra champs <<< "$ligne".
Fichiers, redirections et pipes
| Symbole | Effet |
|---|---|
> |
rediriger la sortie (écrase) |
>> |
rediriger en ajoutant |
2> |
rediriger les erreurs (stderr) |
&> |
rediriger sortie et erreurs |
< |
lire depuis un fichier |
| | | envoyer la sortie vers une autre commande |
- Ignorer toute sortie :
commande &>/dev/null. - Document ici (heredoc) :
cat > config.txt <<EOF
hôte=$HOSTNAME
date=$(date +%F)
EOF
Tableaux
fruits=(pomme poire kiwi)
echo "${fruits[0]}" # pomme
echo "${fruits[@]}" # tous les éléments
echo "${#fruits[@]}" # nombre d'éléments
fruits+=(cerise) # ajouter
- Tableau associatif :
declare -A age; age[alice]=30; echo "${age[alice]}".
Robustesse et bonnes pratiques
- Commencer par
set -euo pipefailpour échouer tôt et proprement. - Toujours quoter les variables :
"$fichier"(évite les bugs avec les espaces). - Vérifier les arguments :
[[ $# -lt 1 ]] && { echo "usage…"; exit 1; }. read -rpour ne pas interpréter les\.- Tester ses scripts avec ShellCheck (linter Bash).
Pour apprendre pas à pas plutôt que réviser, voir le cours Bash de A à Z.