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 Bash
  • chmod +x script.sh puis ./script.sh pour exécuter
  • Variables : NOM="valeur", utilisation : $NOM
  • if [ condition ]; then ... fi — conditions
  • for X in liste; do ... done — boucles
  • set -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.