Bash scripting — automatiser avec la ligne de commande
Un script Bash est une suite de commandes sauvegardées dans un fichier et exécutées automatiquement. Variables, boucles, conditions, cron — apprenez à tout automatiser.
Ce que vous allez apprendre
Vous tapez les mêmes commandes chaque jour : déployer votre application, faire des sauvegardes, vérifier l'état des services. Un script Bash fait tout ça à votre place.
Dans cet article, vous allez écrire vos premiers scripts, utiliser les boucles et conditions, et planifier des tâches automatiques avec cron.
Votre premier script
Un script Bash est un fichier texte contenant des commandes, exécutées dans l'ordre.
Créez le fichier bonjour.sh :
#!/bin/bash
echo "Bonjour depuis le script !"
echo "Nous sommes le $(date)"
echo "Vous êtes dans le dossier : $(pwd)"
La première ligne #!/bin/bash s'appelle le shebang — elle dit au système d'utiliser Bash pour exécuter ce fichier.
Rendez-le exécutable et lancez-le :
chmod +x bonjour.sh
./bonjour.sh
Variables
#!/bin/bash
# Déclarer une variable (pas d'espaces autour du =)
NOM="Kinshasa"
VERSION=1.5
DOSSIER="/var/www/app"
# Utiliser une variable
echo "Bienvenue à $NOM"
echo "Version : $VERSION"
# Capturer la sortie d'une commande
DATE_AUJOURDHUI=$(date +%Y-%m-%d)
NB_FICHIERS=$(ls | wc -l)
echo "Date : $DATE_AUJOURDHUI"
echo "Fichiers dans ce dossier : $NB_FICHIERS"
# Variables spéciales
echo "Nom du script : $0"
echo "Premier argument : $1"
echo "Nombre d'arguments : $#"
echo "Tous les arguments : $@"
Appel avec arguments :
./mon-script.sh production 3000
# $1 = production
# $2 = 3000
Lire l'entrée utilisateur
#!/bin/bash
echo "Quel est votre nom ?"
read NOM
echo "Bonjour, $NOM !"
# Avec un message directement sur la ligne
read -p "Entrez l'environnement (prod/staging) : " ENV
echo "Déploiement vers : $ENV"
Conditions — if / elif / else
#!/bin/bash
SCORE=75
if [ $SCORE -ge 90 ]; then
echo "Excellent !"
elif [ $SCORE -ge 70 ]; then
echo "Bien joué."
elif [ $SCORE -ge 50 ]; then
echo "Passable."
else
echo "À revoir."
fi
Opérateurs de comparaison
# Nombres
-eq # égal
-ne # différent
-gt # supérieur à (greater than)
-ge # supérieur ou égal
-lt # inférieur à (less than)
-le # inférieur ou égal
# Chaînes de caractères
= # égales
!= # différentes
-z # vide (zero length)
-n # non vide
# Fichiers
-f # est un fichier
-d # est un dossier
-e # existe
-x # est exécutable
Exemples :
# Vérifier si un fichier existe
if [ -f "/etc/nginx/nginx.conf" ]; then
echo "Nginx est installé"
fi
# Vérifier si un dossier existe
if [ ! -d "/var/www/app" ]; then
mkdir -p /var/www/app
echo "Dossier créé"
fi
# Vérifier une variable
if [ -z "$DATABASE_URL" ]; then
echo "ERREUR : DATABASE_URL n'est pas défini"
exit 1
fi
Boucles — for et while
Boucle for
#!/bin/bash
# Itérer sur une liste
for VILLE in Kinshasa Lubumbashi Bukavu Goma; do
echo "Ville : $VILLE"
done
# Itérer sur des fichiers
for FICHIER in *.log; do
echo "Traitement de : $FICHIER"
gzip "$FICHIER"
done
# Boucle numérique
for i in $(seq 1 5); do
echo "Étape $i"
done
# Syntax style C
for ((i=0; i<5; i++)); do
echo "Index : $i"
done
Boucle while
#!/bin/bash
COMPTEUR=1
while [ $COMPTEUR -le 5 ]; do
echo "Tentative $COMPTEUR"
COMPTEUR=$((COMPTEUR + 1))
done
# Attendre qu'un service soit disponible
while ! curl -s http://localhost:3000 > /dev/null; do
echo "En attente du serveur..."
sleep 2
done
echo "Serveur prêt !"
Fonctions
#!/bin/bash
# Déclarer une fonction
afficher_titre() {
echo "================================"
echo " $1"
echo "================================"
}
verifier_commande() {
if ! command -v "$1" &>/dev/null; then
echo "ERREUR : $1 n'est pas installé"
exit 1
fi
}
# Appeler les fonctions
afficher_titre "Déploiement de l'application"
verifier_commande "git"
verifier_commande "docker"
verifier_commande "python3"
echo "Tous les outils sont disponibles."
Codes de sortie et gestion d'erreurs
Chaque commande retourne un code : 0 = succès, autre = erreur.
#!/bin/bash
# Arrêter le script à la première erreur
set -e
# Afficher chaque commande avant exécution (debug)
set -x
# Vérifier le code de retour de la dernière commande
git pull
if [ $? -ne 0 ]; then
echo "ERREUR : git pull a échoué"
exit 1
fi
# Raccourci : || = "ou si ça échoue"
git pull || { echo "git pull échoué" ; exit 1; }
# && = "et si ça réussit"
git pull && echo "Code mis à jour avec succès"
Script de déploiement complet
Voici un exemple réaliste — un script de déploiement pour une startup :
#!/bin/bash
set -e
APP_DIR="/var/www/mon-app"
GIT_BRANCH="main"
LOG_FILE="/var/log/deploy.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "Déploiement démarré"
# Vérifier les outils requis
for OUTIL in git python3 pip; do
command -v "$OUTIL" &>/dev/null || { log "ERREUR : $OUTIL manquant"; exit 1; }
done
# Aller dans le dossier de l'application
cd "$APP_DIR"
# Mettre à jour le code
log "Mise à jour du code depuis Git..."
git fetch origin
git checkout "$GIT_BRANCH"
git pull origin "$GIT_BRANCH"
# Installer les dépendances
log "Installation des dépendances..."
pip install -r requirements.txt --quiet
# Redémarrer le service
log "Redémarrage du service..."
sudo systemctl restart mon-app
# Vérifier que le service a démarré
sleep 3
if systemctl is-active --quiet mon-app; then
log "Déploiement réussi !"
else
log "ERREUR : le service n'a pas démarré"
exit 1
fi
Cron — planifier des tâches
cron exécute automatiquement des scripts à intervalles réguliers.
# Éditer les tâches cron de l'utilisateur actuel
crontab -e
# Voir les tâches cron actuelles
crontab -l
Format d'une ligne cron :
# minute heure jour-du-mois mois jour-de-semaine commande
* * * * * commande
Exemples :
# Sauvegarder la base de données tous les jours à 2h du matin
0 2 * * * /home/ubuntu/scripts/backup-db.sh >> /var/log/backup.log 2>&1
# Vider les logs temporaires tous les lundis à minuit
0 0 * * 1 find /tmp -name "*.log" -mtime +7 -delete
# Redémarrer l'application toutes les heures
0 * * * * sudo systemctl restart mon-app
# Vérifier l'espace disque toutes les 15 minutes
*/15 * * * * df -h | grep -vE "^Filesystem" >> /var/log/disk-usage.log
curl et wget — télécharger et appeler des APIs
# Télécharger un fichier
wget https://example.com/fichier.zip
# Télécharger et sauvegarder avec un nom précis
curl -o fichier.zip https://example.com/fichier.zip
# Appeler une API REST (GET)
curl https://api.example.com/data
# Appeler une API avec JSON (POST)
curl -X POST https://api.example.com/articles -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{"title": "Mon article", "published": true}'
# Tester si un service est accessible
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000
À retenir
#!/bin/bash(shebang) = première ligne de tout script Bashchmod +x script.shpuis./script.shpour exécuter- Variables :
NOM="valeur", utilisation :$NOM if [ condition ]; then ... fi— conditionsfor X in liste; do ... done— bouclesset -e— stopper le script à la première erreur$?— code de retour de la dernière commande (0 = succès)crontab -e— planifier des tâches automatiques
Prochaine étape
Appliquez vos scripts dans un pipeline CI/CD : automatisez les tests et le déploiement de votre application à chaque push avec GitHub Actions.