Script bash pour débutants : premier script, variables, conditions, boucles et cron
Un script bash est un fichier texte contenant des commandes du shell, qui commence par la ligne #!/bin/bash, reçoit le droit d'exécution avec chmod +x et se lance par ./script.sh. Les scripts utilisent des variables, les arguments $1 et $2, les conditions if et les boucles for et while ; l'exécution régulière se programme avec crontab -e.
Un script bash est un simple fichier texte contenant des commandes que vous taperiez autrement une par une dans le terminal. Le script commence par la ligne shebang #!/bin/bash, reçoit le droit d'exécution avec chmod +x et se lance par ./script.sh. Ce guide du script bash pour débutants vous accompagne de la première ligne jusqu'à l'exécution planifiée : variables, arguments, conditions, boucles, gestion des erreurs et cron.
Votre premier script bash en une minute
Créez un fichier dans l'éditeur de votre choix, par exemple nano :
nano bonjour.sh
#!/bin/bash
# Premier script : un message d'accueil et quelques informations sur le système
echo "Bonjour, $USER !"
echo "Aujourd'hui : $(date +%Y-%m-%d)"
echo "Vous êtes dans : $(pwd)"
Enregistrez (Ctrl+O, Entrée, Ctrl+X), donnez le droit d'exécution et lancez le script :
$ chmod +x bonjour.sh
$ ./bonjour.sh
Bonjour, alice !
Aujourd'hui : 2026-10-12
Vous êtes dans : /home/alice
Les lignes commençant par # sont des commentaires. $(commande) insère directement dans une ligne la sortie d'une commande.
Shebang : à quoi sert la première ligne
La ligne #!/bin/bash indique au système quel interpréteur doit exécuter le fichier. Sans elle, le script s'exécute avec le shell disponible ; sur certains systèmes, /bin/sh n'est pas bash mais le plus simple dash, où certaines constructions ne fonctionnent pas.
La variante #!/usr/bin/env bash est également fréquente : elle cherche bash dans le PATH, pratique lorsque bash n'est pas installé dans /bin.
Comment lancer un script et pourquoi ./
Il y a deux façons de faire :
./bonjour.sh— nécessite le shebang et le droitx. Le préfixe./est obligatoire, car le répertoire courant ne fait pas partie duPATH.bash bonjour.sh— pas besoin de droit d'exécution, l'interpréteur est indiqué explicitement.
Si vous voyez command not found sans ./, ou Permission denied sans chmod +x, ce sont exactement les deux causes possibles. Pour appeler vos scripts par leur nom depuis n'importe où, placez-les dans ~/bin ou /usr/local/bin.
Variables
Une variable s'affecte sans espaces autour du = et se lit avec $ :
#!/bin/bash
nom="sauvegarde"
dossier="/var/backups"
aujourdhui=$(date +%F)
echo "Fichier : ${dossier}/${nom}-${aujourdhui}.tar.gz"
Les accolades séparent le nom de la variable du texte qui l'entoure. La ligne nom = "sauvegarde" avec des espaces est une erreur : bash essaiera d'exécuter une commande nommée nom.
Les guillemets comptent
Entre guillemets doubles, les variables sont remplacées ; entre guillemets simples, non. Il faut presque toujours mettre les variables entre guillemets doubles, sinon un nom de fichier contenant un espace sera découpé en deux arguments.
fichier="mon rapport.txt"
rm $fichier # erreur : tente de supprimer « mon » et « rapport.txt »
rm "$fichier" # correct
echo '$HOME' # affiche littéralement $HOME
echo "$HOME" # affiche /home/alice
Variables d'environnement
Des variables comme $HOME, $USER et $PATH sont définies par le système. Votre propre variable est transmise aux processus enfants avec export. Les réglages permanents de l'environnement vont dans ~/.bashrc ou ~/.profile.
Arguments du script
Les valeurs passées au lancement sont accessibles sous la forme $1, $2, etc.
| Variable | Ce qu'elle contient |
|---|---|
$0 | le nom du script |
$1, $2… | le premier, le deuxième argument |
$# | le nombre d'arguments |
"$@" | tous les arguments, chacun séparément |
$? | le code de sortie de la dernière commande |
$$ | le PID du script en cours |
#!/bin/bash
echo "Le script $0 a reçu $# argument(s)"
echo "Le premier : $1"
$ ./arguments.sh nginx 80
Le script ./arguments.sh a reçu 2 argument(s)
Le premier : nginx
La saisie de l'utilisateur se lit avec la commande read : read -p "Saisissez le nom : " nom.
Conditions if
Chaque commande renvoie un code de sortie : 0 signifie succès, toute autre valeur une erreur. La construction if teste précisément ce code. Pour les comparaisons, on utilise [[ ... ]] ; les espaces à l'intérieur des crochets sont obligatoires.
#!/bin/bash
if [[ $# -eq 0 ]]; then
echo "Usage : $0 <dossier>"
exit 1
fi
if [[ -d "$1" ]]; then
echo "Le dossier $1 existe"
elif [[ -f "$1" ]]; then
echo "$1 est un fichier, pas un dossier"
else
echo "$1 introuvable"
fi
| Test | Signification |
|---|---|
-f fichier | un fichier ordinaire existe |
-d dossier | un dossier existe |
-e chemin | le chemin existe |
-x fichier | le fichier est exécutable |
-z "$var" / -n "$var" | la chaîne est vide / non vide |
"$a" == "$b", != | comparaison de chaînes |
-eq -ne -lt -le -gt -ge | comparaison de nombres |
On peut aussi tester directement une commande :
if systemctl is-active --quiet nginx; then
echo "nginx fonctionne"
else
echo "nginx est arrêté"
fi
Pour de nombreux cas possibles, case est commode :
case "$1" in
start) echo "Démarrage" ;;
stop) echo "Arrêt" ;;
*) echo "Commande inconnue : $1"; exit 1 ;;
esac
Boucles for et while
for : parcourir une liste
for hote in web1 web2 db1; do
echo "Vérification de $hote"
ping -c 1 -W 1 "$hote" > /dev/null && echo " joignable" || echo " injoignable"
done
for fichier in /var/log/*.log; do
echo "$fichier : $(wc -l < "$fichier") lignes"
done
for i in {1..5}; do
echo "Tentative $i"
done
while : tant que la condition est vraie
Un exemple classique est la lecture ligne par ligne d'un fichier :
while read -r utilisateur; do
echo "Utilisateur : $utilisateur"
done < utilisateurs.txt
Et l'attente qu'un service soit prêt :
compteur=0
until curl -sf http://localhost:8080/health > /dev/null; do
compteur=$((compteur + 1))
if [[ $compteur -ge 10 ]]; then
echo "Le service n'a pas démarré"
exit 1
fi
sleep 3
done
echo "Le service est prêt"
L'arithmétique en bash s'écrit entre doubles parenthèses : $((a + b)). Elle ne fonctionne qu'avec des entiers.
Fonctions
On regroupe le code répétitif dans des fonctions. À l'intérieur d'une fonction, les arguments sont les mêmes $1, $2, et local empêche une variable de sortir de la fonction.
journal() {
local niveau="$1"; shift
echo "$(date '+%F %T') [$niveau] $*"
}
journal INFO "Début de la sauvegarde"
journal ERROR "Plus d'espace disque"
Gestion des erreurs : set -euo pipefail
Par défaut, bash continue après l'échec d'une commande — un script de sauvegarde peut ainsi se terminer « avec succès » sans rien copier. On ajoute donc souvent un mode strict en début de script :
#!/bin/bash
set -euo pipefail
-e— s'arrêter à la première erreur.-u— considérer l'utilisation d'une variable non définie comme une erreur (protège contrerm -rf "$DOSSIER/"avec unDOSSIERvide).-o pipefail— un pipeline échoue si l'une de ses parties échoue.
Pour le débogage, lancez le script avec bash -x script.sh : bash affiche chaque commande avant de l'exécuter. L'utilitaire shellcheck repère les erreurs typiques avant le lancement.
Exemple pratique : un script de sauvegarde
#!/bin/bash
set -euo pipefail
SOURCE="${1:-/var/www}"
DESTINATION="/var/backups/site"
JOURS_CONSERVATION=7
HORODATAGE=$(date +%F_%H-%M)
mkdir -p "$DESTINATION"
tar -czf "$DESTINATION/site-$HORODATAGE.tar.gz" -C "$(dirname "$SOURCE")" "$(basename "$SOURCE")"
echo "Archive créée : $DESTINATION/site-$HORODATAGE.tar.gz"
# supprimer les archives plus anciennes que JOURS_CONSERVATION jours
find "$DESTINATION" -name "site-*.tar.gz" -mtime +"$JOURS_CONSERVATION" -delete
L'expression ${1:-/var/www} signifie « le premier argument, ou /var/www s'il n'y en a pas ». Enregistrez le script sous /usr/local/bin/backup-site.sh et rendez-le exécutable : sudo chmod +x /usr/local/bin/backup-site.sh.
Exécution planifiée : cron
Cron est le service qui lance des commandes selon un calendrier. Les tâches d'un utilisateur se modifient avec crontab -e, s'affichent avec crontab -l, celles de root avec sudo crontab -e.
Une ligne de tâche se compose de cinq champs horaires et de la commande :
# minute heure jour_du_mois mois jour_de_la_semaine commande
30 2 * * * /usr/local/bin/backup-site.sh >> /var/log/backup.log 2>&1
| Planification | Moment d'exécution |
|---|---|
*/5 * * * * | toutes les 5 minutes |
0 * * * * | au début de chaque heure |
30 2 * * * | chaque jour à 02:30 |
0 9 * * 1-5 | les jours ouvrés à 09:00 |
0 3 1 * * | le 1er de chaque mois à 03:00 |
@reboot | une fois après le démarrage |
Pourquoi un script fonctionne à la main mais pas dans cron
- Environnement différent. Cron lance les tâches avec un
PATHminimal et sans votre~/.bashrc. Écrivez les chemins complets des commandes et des fichiers, ou définissezPATHen tête de la crontab. - Répertoire courant différent. La tâche démarre dans le répertoire personnel, et non là où se trouve le script. Utilisez des chemins absolus.
- Le caractère %. Dans une crontab, le signe
%signifie un saut de ligne ;date +%Fécrit directement dans la tâche doit donc être échappé en\%. Le plus simple est de placer la commande dans un script. - La sortie se perd. Redirigez la sortie vers un journal (
>> fichier 2>&1), sinon vous ne verrez pas les erreurs. Les exécutions de cron apparaissent dansjournalctl -u cron(sur les systèmes de type RHEL, le service s'appellecrond).
Sur les systèmes avec systemd, les timers sont une alternative à cron : ils écrivent leur sortie dans le journal et peuvent rattraper les exécutions manquées.
Synthèse
Un script bash pour débutants est un fichier commençant par le shebang #!/bin/bash, doté du droit d'exécution et d'une suite de commandes. Ajoutez des variables entre guillemets, une vérification des arguments avec if, les boucles for et while, le mode strict set -euo pipefail — et vous obtenez un outil d'automatisation fiable que cron peut exécuter selon un calendrier. Les scripts bash, l'environnement et cron sont traités pas à pas et en pratique dans notre cours sur Linux.
Questions fréquentes
Quelle est la différence entre bash et sh ?
sh est le shell POSIX standard, tandis que bash en est la version étendue, avec les tableaux, les doubles crochets et d'autres commodités. Un script qui utilise des constructions bash doit être lancé avec bash, et non avec sh.
Quelle extension doit avoir un script bash ?
Linux ne regarde pas l'extension : c'est le shebang qui détermine l'interpréteur. L'extension .sh est seulement une convention pour indiquer à l'humain qu'il s'agit d'un script.
Comment transmettre un mot de passe à un script de façon sûre ?
Ne le passez pas en argument : les arguments sont visibles des autres utilisateurs dans ps. Utilisez une variable d'environnement issue d'un fichier aux droits 600, ou read -s pour une saisie sans affichage.
Comment vérifier que le script est lancé en root ?
Comparez l'identifiant de l'utilisateur à zéro : if [[ $EUID -ne 0 ]]; then echo "Root requis"; exit 1; fi.
Comment lancer un script en arrière-plan pour qu'il ne s'arrête pas à la fermeture de la session SSH ?
Utilisez nohup ./script.sh &, une session tmux ou screen, et pour un fonctionnement permanent, transformez le script en service systemd.
Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».
- Bash-скрипты: от команды в терминале до рабочего скрипта автоматизации
- Пакеты, окружение и первая автоматизация: apt, профиль и cron