Document

SUBSCRIBE TO GET FULL ACCESS TO THE E-BOOKS FOR FREE 🎁SUBSCRIBE NOW

Professional Dropdown with Icon

SUBSCRIBE NOW TO GET FREE ACCESS TO EBOOKS

Écrire vos premiers scripts bash : variables, tests et boucles

À la fin de ce tutoriel bash scripting, vous saurez créer un script débutant avec shebang, variables, arguments, if/for/while, fonctions, redirections et codes de sortie — puis un mini healthcheck (ping ou curl) loggé dans /tmp.

Niveau : Débutant · Temps estimé : 50–60 min · Versions testées : Ubuntu 22.04 / 24.04, Debian 12 ; notes Rocky/Alma 9 · Dernière vérification : 2026-09-10

Slug proposé : linux-bash-scripting · Série : P5 Linux Basics · Remplace / fusionne : N/A — création

Prérequis

  • Avoir suivi Diagnostiquer le réseau Linux avec ip, ss et curl (ping, curl, lecture de codes HTTP)
  • Une VM ou WSL jetable (Ubuntu/Debian ou Rocky/Alma 9) avec bash
  • Éditeur de texte (nano, vim, VS Code Distant) ; aucune clé / secret / mot de passe dans les scripts
  • Connaître chemins, permissions (chmod) et redirection de base (>, |)

Coût estimé : 0 €. Lab entièrement dans /tmp — jetable et sans effet de bord.

Ce que nous allons construire (bash scripting)

Shebang + chmod +x + ./script.sh
  → Variables, quotes, $1 / $#
  → if / then / fi · for · while
  → Exit codes + set -euo pipefail (avec mesure)
  → Fonctions basiques
  → Redirection & pipes dans un script
  → Lab healthcheck (curl/ping → log /tmp)
  → Erreurs fréquentes · quiz · FAQ

(Schéma à remplacer par une image locale Excalidraw / draw.io, alt : « Bash scripting : shebang, variables, if, for, exit codes — lab junior DevOps ».)

Septième chapitre de Linux Basics. Les scripts automatisent les checks réseau du chapitre précédent. Pour multi-machines : Ansible. Évitez les provisioners shell opaques dans Terraform (remote-exec en prod : rarement une bonne idée).

Étape 1 — Shebang, permissions et exécution

Un fichier texte devient un script quand (1) la première ligne indique l’interpréteur (shebang) et (2) le bit exécutable est posé.

mkdir -p /tmp/lab-bash
cat > /tmp/lab-bash/hello.sh << 'SCRIPT'
#!/usr/bin/env bash
# Premier script — lab Linux Basics
echo "Bonjour depuis bash : $(date -Iseconds)"
SCRIPT
chmod +x /tmp/lab-bash/hello.sh
/tmp/lab-bash/hello.sh
# Ou depuis le dossier :
cd /tmp/lab-bash && ./hello.sh
Élément Rôle
#!/usr/bin/env bash Cherche bash dans le PATH (portable Ubuntu/Debian et Rocky)
chmod +x Ajoute le droit d’exécution pour le propriétaire
./hello.sh Exécute le fichier du répertoire courant (. n’est pas dans le PATH)

Pourquoi env bash plutôt que #!/bin/bash ? Sur la plupart des distros modernes /bin/bash existe, mais env reste le réflexe portable (surtout hors Debian). Rocky/Alma : même shebang ; vérifiez bash --version (souvent 5.x).

Sans chmod +x, vous pouvez toujours lancer : bash /tmp/lab-bash/hello.sh — utile pour tester avant de rendre exécutable.

Étape 2 — Bases du bash scripting : variables, quotes, $1 et $#

On commence souvent le bash scripting par « stocker une valeur et la réutiliser ».

cat > /tmp/lab-bash/vars.sh << 'SCRIPT'
#!/usr/bin/env bash
NOM="lab-devops"
CIBLE="$1"
NB="$#"
echo "Projet : $NOM"
echo "Argument 1 : ${CIBLE:-"(aucun)"}"
echo "Nombre d'arguments : $NB"
# Quotes : double = expansion ; simple = littéral
echo "Double : $NOM"
echo 'Simple : $NOM'
SCRIPT
chmod +x /tmp/lab-bash/vars.sh
./vars.sh example.com
./vars.sh

Règles courtes :

  • VAR=valeur (pas d’espace autour de =)
  • "$VAR" : expansion ; '$VAR' : littéral (affiche $VAR)
  • $1, $2, … : arguments positionnels ; $# : nombre d’arguments ; $@ : tous les args
  • ${CIBLE:-défaut} : valeur de repli si vide / non définie

Pas de secrets dans un script versionné — environnement ou coffre, hors lab.

Étape 3 — if / then, for, while (exemples courts)

Les tests ([[ … ]]) et les boucles transforment un one-liner en outil réutilisable.

cat > /tmp/lab-bash/control.sh << 'SCRIPT'
#!/usr/bin/env bash
HOTE="${1:-example.com}"

# if / then / else / fi
if [[ -n "$HOTE" ]]; then
  echo "Cible : $HOTE"
else
  echo "Pas de cible" >&2
  exit 1
fi

# for : itérer une liste
for i in 1 2 3; do
  echo "essai #$i"
done

# while : boucle bornée (évitez while true sans garde en lab)
n=0
while [[ $n -lt 3 ]]; do
  echo "while n=$n"
  n=$((n + 1))
done
SCRIPT
chmod +x /tmp/lab-bash/control.sh
./control.sh example.com

Tests utiles : -f, -d, -z / -n, ==, -eq/-lt/-gt. Préférez [[ à [ (moins de pièges de quoting).

Étape 4 — Exit codes et set -euo pipefail (sans dogmatisme)

Chaque commande renvoie un exit code : 0 = succès, ≠0 = échec. Un script propage le code de la dernière commande exécutée, sauf exit N explicite.

cat > /tmp/lab-bash/exits.sh << 'SCRIPT'
#!/usr/bin/env bash
# Mode strict utile en lab — à comprendre, pas à coller aveuglément partout
set -euo pipefail

curl -sS -o /dev/null -w "%{http_code}n" --max-time 5 "https://example.com/" || {
  echo "curl a échoué (réseau / DNS)" >&2
  exit 2
}
echo "OK — fin script"
SCRIPT
chmod +x /tmp/lab-bash/exits.sh
./exits.sh ; echo "exit du script = $?"
Option Effet Quand c’est utile
set -e Quitte si une commande échoue Scripts courts où chaque étape doit réussir
set -u Erreur si variable non définie Évite $typo silencieux
set -o pipefail Le pipeline échoue si un maillon échoue cmd | grep ne masque plus l’échec de cmd

Sans dogmatisme : set -e a des cas subtils (if cmd; then, cmd || true). Sur des scripts linéaires, activez-le ; sinon testez explicitement (cmd || exit 2) et documentez vos codes.

Étape 5 — Fonctions basiques

Les fonctions évitent de dupliquer un bloc (log, check HTTP).

cat > /tmp/lab-bash/funcs.sh << 'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail

log() {
  # $1 = message
  echo "[$(date -Iseconds)] $*"
}

http_code() {
  local url="$1"
  curl -sS -o /dev/null -w "%{http_code}" --max-time 8 "$url"
}

log "début"
code="$(http_code "https://example.com/")"
log "example.com → HTTP $code"
[[ "$code" == "200" || "$code" == "301" || "$code" == "302" ]] || exit 3
log "fin OK"
SCRIPT
chmod +x /tmp/lab-bash/funcs.sh
./funcs.sh

local limite la portée. Pour retransmettre les args : "$@" (pas "$*").

Étape 6 — Redirection et pipes dans un script

Même syntaxe qu’en interactif : > écrase, >> ajoute, 2> stderr, | pipe, tee pour écran + fichier.

# Aperçu (le lab complet est à l’étape 7)
{
  echo "=== snapshot ==="
  date -Iseconds
  hostname
} | tee /tmp/lab-bash/snapshot.txt
wc -l /tmp/lab-bash/snapshot.txt

En monitoring réel on journalise parfois sous /var/log/ (droits root) — restez sur /tmp en lab.

Étape 7 — Lab : healthcheck ping/curl + log /tmp

Objectif : un petit outil qui (1) teste une URL, (2) optionnellement un ping ICMP, (3) append un log horodaté, (4) renvoie un exit code exploitable par cron ou CI.

cat > /tmp/lab-bash/healthcheck.sh << 'SCRIPT'
#!/usr/bin/env bash
set -euo pipefail

URL="${1:-https://example.com/}"
LOG="${LOG:-/tmp/lab-bash/healthcheck.log}"
mkdir -p "$(dirname "$LOG")"

ts() { date -Iseconds; }

log() { echo "[$(ts)] $*" | tee -a "$LOG"; }

# HTTP : code + temps total
code="$(curl -sS -o /dev/null -w "%{http_code}" --max-time 10 "$URL" || echo "000")"
log "HTTP $code  url=$URL"

# Ping optionnel (ICMP peut être bloqué — ne pas en faire l’unique critère)
host="${URL#https://}"; host="${host#http://}"; host="${host%%/*}"
if ping -c 1 -W 3 "$host" &>/dev/null; then
  log "PING ok    host=$host"
else
  log "PING fail  host=$host (ICMP filtré ? continuer sur HTTP)"
fi

if [[ "$code" =~ ^(200|301|302)$ ]]; then
  log "RESULT OK"
  exit 0
fi
log "RESULT FAIL"
exit 1
SCRIPT
chmod +x /tmp/lab-bash/healthcheck.sh

# Exécutions lab
./healthcheck.sh https://example.com/
./healthcheck.sh https://httpbin.org/status/200
# Lire le journal
tail -n 20 /tmp/lab-bash/healthcheck.log

Ubuntu/Debian : sudo apt install -y curl iputils-ping si besoin. Rocky/Alma : sudo dnf install -y curl iputils. Validé : log rempli, exit 0 sur 200/3xx, aucun secret dans /tmp/lab-bash/.

Nettoyage

rm -rf /tmp/lab-bash
echo "lab bash nettoyé — OK"

Erreurs fréquentes

Symptôme Cause Correction
bashr: No such file or directory / shebang bizarre Fins de ligne CRLF (fichier édité sous Windows) sed -i 's/r$//' script.sh ou « LF » dans l’éditeur
Permission denied Pas de +x chmod +x script.sh ou bash script.sh
./script.sh: command not found Oubli de ./ ou PATH Lancez ./script.sh depuis le dossier
unbound variable / exit immédiat set -u + variable non définie Initialisez (VAR="${1:-}") ou testez avant usage
command not found sur une ligne VAR = value Espaces autour de = VAR=value strict
Script OK en interactif, KO en cron PATH minimal / shebang manquant Shebang + chemins absolus (/usr/bin/curl)

Quiz (3 questions)

1. À quoi sert #!/usr/bin/env bash ?
– A. À commenter le fichier
– B. À indiquer au noyau d’exécuter le script avec bash trouvé via PATH
– C. À installer bash automatiquement

2. Comment rendre un script exécutable ?
– A. chmod +x script.sh puis ./script.sh
– B. Uniquement chown root
– C. curl -I script.sh

3. Différence entre "$VAR" et '$VAR' ?
– A. Aucune
– B. Double quotes : expansion de la variable ; simple quotes : littéral (affiche $VAR)
– C. Simple quotes exécutent la commande

Réponses : 1‑B · 2‑A · 3‑B

FAQ

À quoi sert #!/usr/bin/env bash ?
C’est le shebang : la première ligne dit au système quel interpréteur utiliser. env résout bash dans le PATH, ce qui reste portable entre Ubuntu/Debian et Rocky/Alma. Sans shebang (ou sans +x), lancez explicitement bash script.sh.

Comment rendre un script exécutable ?
chmod +x /chemin/script.sh, puis exécutez-le avec ./script.sh (ou le chemin absolu). Vérifiez avec ls -l : un x doit apparaître dans les droits. Alternative de test : bash script.sh sans bit exécutable.

Différence ” et ‘ en bash ?
Doubles quotes : expansion ($VAR, $(…)). Simples quotes : littéral. En bash scripting, quotez les expansions ("$1", "$URL") pour gérer les espaces.

Pour aller plus loin

  • man bash (sections PARAMETERS, CONDITIONAL EXPRESSIONS), help [[, help set
  • Suite série : SSH & clés pour lancer vos scripts sur une machine distante
  • Au-delà du one-host : Ansible ; côté IaC, préférez des ressources déclaratives à des provisioners shell opaques (Terraform overview)

Maillage série Linux Basics (P5)

← Précédent Diagnostiquer le réseau Linux avec ip, ss et curl
→ Suivant Se connecter en SSH avec des clés : ssh-keygen, agent et config
Hub Linux Basics
Aussi Terraform overview (éviter provisioners shell lourds) · Ansible (suite logique multi-hosts)

Meta publication (à remplir dans Rank Math / SEO)

  • Title SEO : Bash scripting débutant : shebang, variables, if, for (2026)
  • Meta description (≤ 155) : Créez des scripts bash utiles : shebang, variables, tests, boucles, exit codes. Automatisez vos labs Linux DevOps.
  • Focus keyphrase : bash scripting
  • KW secondaires : script bash débutant, shebang, variables bash, if then fi, boucle for bash
  • Schemas Rank Math : Article + HowTo (étapes lab) + FAQ (3 questions ci-dessus)
  • Image mise en avant : assets/web/devopelastichayway/cover-linux-bash-scripting-1200x630.webp (Visuels Linux — WebP 1200×630)
  • Catégorie : Linux · Niveau : Débutant
  • Slug : linux-bash-scripting

← Retour parcours Linux — Basics, Admin, Réseau & Sécurité, Shell & Automation.