Conditions
Table des matières
- Structure if/elif/else
- Tests de fichiers
- Tests de chaînes
- Tests numériques
- Opérateurs logiques
- Structure case
- Exercices pratiques
1 - Structure if/elif/else
Syntaxe de base
if [ condition ]; then
# commandes si vrai
fi
# Avec else
if [ condition ]; then
# commandes si vrai
else
# commandes si faux
fi
# Avec elif
if [ condition1 ]; then
# si condition1 vraie
elif [ condition2 ]; then
# si condition2 vraie
else
# sinon
fi
Test avec [ ] vs [[ ]]
[ ] | [[ ]] |
|---|---|
| POSIX standard | Bash étendu |
| Plus portable | Plus de fonctionnalités |
| Nécessite échappement | Pattern matching natif |
# [ ] standard
if [ "$var" = "test" ]; then
echo "ok"
fi
# [[ ]] étendu (recommandé en Bash)
if [[ $var == "test" ]]; then
echo "ok"
fi
# Pattern matching (seulement avec [[ ]])
if [[ $fichier == *.txt ]]; then
echo "Fichier texte"
fi
Test avec commande
# Le code de retour détermine vrai/faux
if grep -q "error" /var/log/syslog; then
echo "Erreurs trouvées"
fi
# Commande directe
if ping -c 1 google.com > /dev/null 2>&1; then
echo "Internet OK"
else
echo "Pas de connexion"
fi
🔝 Retour à la table des matières
2 - Tests de fichiers
Opérateurs de test
| Opérateur | Description |
|---|---|
-e file | Existe |
-f file | Est un fichier régulier |
-d file | Est un répertoire |
-r file | Est lisible |
-w file | Est modifiable |
-x file | Est exécutable |
-s file | Taille > 0 |
-L file | Est un lien symbolique |
f1 -nt f2 | f1 plus récent que f2 |
f1 -ot f2 | f1 plus ancien que f2 |
Exemples
#!/bin/bash
file="/etc/passwd"
# Vérifier l'existence
if [ -e "$file" ]; then
echo "$file existe"
fi
# Vérifier si c'est un fichier
if [ -f "$file" ]; then
echo "$file est un fichier"
fi
# Vérifier si lisible
if [ -r "$file" ]; then
echo "$file est lisible"
fi
# Vérifier si un répertoire existe
if [ -d "/var/log" ]; then
echo "/var/log est un répertoire"
fi
# Combiné
if [ -f "$file" ] && [ -r "$file" ]; then
echo "$file est un fichier lisible"
fi
Script pratique
#!/bin/bash
# Vérifier un fichier de configuration
CONFIG_FILE="${1:-/etc/myapp.conf}"
if [ ! -e "$CONFIG_FILE" ]; then
echo "Erreur: $CONFIG_FILE n'existe pas"
exit 1
fi
if [ ! -f "$CONFIG_FILE" ]; then
echo "Erreur: $CONFIG_FILE n'est pas un fichier"
exit 1
fi
if [ ! -r "$CONFIG_FILE" ]; then
echo "Erreur: $CONFIG_FILE n'est pas lisible"
exit 1
fi
echo "Configuration OK: $CONFIG_FILE"
🔝 Retour à la table des matières
3 - Tests de chaînes
Opérateurs
| Opérateur | Description |
|---|---|
-z str | Chaîne vide |
-n str | Chaîne non vide |
str1 = str2 | Égalité |
str1 != str2 | Différence |
str1 < str2 | Avant (alphabétique) |
str1 > str2 | Après (alphabétique) |
Exemples
nom="Alice"
vide=""
# Chaîne vide
if [ -z "$vide" ]; then
echo "La variable est vide"
fi
# Chaîne non vide
if [ -n "$nom" ]; then
echo "La variable contient: $nom"
fi
# Égalité
if [ "$nom" = "Alice" ]; then
echo "Bonjour Alice"
fi
# Avec [[ ]] (recommandé)
if [[ $nom == "Alice" ]]; then
echo "Bonjour Alice"
fi
Pattern matching (avec [[ ]])
email="[email protected]"
# Pattern avec *
if [[ $email == *@*.* ]]; then
echo "Format email valide"
fi
# Pattern avec ?
if [[ $fichier == ???.txt ]]; then
echo "Fichier de 3 caractères .txt"
fi
# Regex avec =~
if [[ $email =~ ^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+$ ]]; then
echo "Email valide (regex)"
fi
Important
Toujours mettre les variables entre guillemets dans [ ] pour éviter les erreurs avec les chaînes vides ou contenant des espaces.
🔝 Retour à la table des matières
4 - Tests numériques
Opérateurs de comparaison
| Opérateur | Signification |
|---|---|
-eq | Égal |
-ne | Non égal |
-lt | Inférieur (less than) |
-le | Inférieur ou égal |
-gt | Supérieur (greater than) |
-ge | Supérieur ou égal |
Exemples
age=25
if [ $age -ge 18 ]; then
echo "Majeur"
else
echo "Mineur"
fi
# Avec [[ ]] ou (( ))
if [[ $age -ge 18 ]]; then
echo "Majeur"
fi
# Arithmétique avec (( )) - syntaxe C
if (( age >= 18 )); then
echo "Majeur"
fi
if (( age > 20 && age < 30 )); then
echo "Entre 20 et 30 ans"
fi
Opérateurs arithmétiques dans (( ))
a=10
b=3
if (( a > b )); then echo "a > b"; fi
if (( a == 10 )); then echo "a == 10"; fi
if (( a % 2 == 0 )); then echo "a est pair"; fi
if (( a >= 5 && a <= 15 )); then echo "a entre 5 et 15"; fi
🔝 Retour à la table des matières
5 - Opérateurs logiques
Dans [ ]
| Opérateur | Description |
|---|---|
! expr | NON (négation) |
expr1 -a expr2 | ET |
expr1 -o expr2 | OU |
# Négation
if [ ! -f "/tmp/lock" ]; then
echo "Pas de fichier lock"
fi
# ET
if [ -f "$file" -a -r "$file" ]; then
echo "Fichier existe et lisible"
fi
# OU
if [ -z "$var" -o "$var" = "default" ]; then
var="default"
fi
Dans [[ ]] (recommandé)
| Opérateur | Description |
|---|---|
! expr | NON |
expr1 && expr2 | ET |
expr1 || expr2 | OU |
# Plus lisible avec [[ ]]
if [[ -f "$file" && -r "$file" ]]; then
echo "Fichier existe et lisible"
fi
if [[ -z "$var" || "$var" == "default" ]]; then
var="default"
fi
# Combinaison complexe
if [[ ( $a -gt 5 && $b -lt 10 ) || $c -eq 0 ]]; then
echo "Condition complexe vraie"
fi
Opérateurs en dehors des tests
# && : exécute si succès
mkdir /tmp/test && echo "Répertoire créé"
# || : exécute si échec
cd /nonexistent || echo "Échec du cd"
# Combinaison courante
command && echo "OK" || echo "FAIL"
🔝 Retour à la table des matières
6 - Structure case
Syntaxe
case $variable in
pattern1)
# commandes
;;
pattern2|pattern3)
# commandes pour pattern2 OU pattern3
;;
*)
# défaut (comme else)
;;
esac
Exemple : Menu
#!/bin/bash
echo "1. Afficher la date"
echo "2. Afficher l'utilisateur"
echo "3. Quitter"
read -p "Choix: " choix
case $choix in
1)
date
;;
2)
echo "Utilisateur: $USER"
;;
3)
echo "Au revoir!"
exit 0
;;
*)
echo "Choix invalide"
exit 1
;;
esac
Patterns avancés
#!/bin/bash
fichier="$1"
case $fichier in
*.txt)
echo "Fichier texte"
;;
*.jpg|*.png|*.gif)
echo "Image"
;;
*.sh)
echo "Script shell"
;;
[0-9]*)
echo "Commence par un chiffre"
;;
*)
echo "Type inconnu"
;;
esac
Traitement d'options
#!/bin/bash
while [[ $# -gt 0 ]]; do
case $1 in
-v|--verbose)
VERBOSE=true
shift
;;
-f|--file)
FILE="$2"
shift 2
;;
-h|--help)
echo "Usage: $0 [-v] [-f file]"
exit 0
;;
*)
echo "Option inconnue: $1"
exit 1
;;
esac
done
🔝 Retour à la table des matières
7 - Exercices pratiques
Exercice 1 : Vérification d'âge
# Script qui demande l'âge et affiche:
# - "Mineur" si < 18
# - "Majeur" si >= 18 et < 65
# - "Senior" si >= 65
Solution
#!/bin/bash
read -p "Entrez votre âge: " age
if (( age < 18 )); then
echo "Mineur"
elif (( age < 65 )); then
echo "Majeur"
else
echo "Senior"
fi
Exercice 2 : Type de fichier
# Script qui prend un chemin en argument et affiche:
# - "Fichier" si c'est un fichier
# - "Répertoire" si c'est un répertoire
# - "Lien" si c'est un lien symbolique
# - "N'existe pas" sinon
Solution
#!/bin/bash
path="${1:?Usage: $0 <path>}"
if [ -L "$path" ]; then
echo "Lien symbolique"
elif [ -f "$path" ]; then
echo "Fichier"
elif [ -d "$path" ]; then
echo "Répertoire"
else
echo "N'existe pas"
fi
Quiz
Q1. Quelle est la différence entre [ ] et [[ ]] ?
Réponse
[ ] est POSIX standard, [[ ]] est spécifique Bash avec plus de fonctionnalités (pattern matching, regex, pas besoin d'échapper).
Q2. Comment tester si un fichier existe et est lisible ?
Réponse
if [[ -f "$file" && -r "$file" ]]; then ...
Q3. Comment comparer deux nombres en Bash ?
Réponse
Avec -eq, -ne, -lt, -le, -gt, -ge ou avec (( )) pour la syntaxe arithmétique.
🔝 Retour à la table des matières
Points clés à retenir
[[ ]]>[ ]en Bash (plus de fonctionnalités)- Tests fichiers:
-e,-f,-d,-r,-w,-x - Tests chaînes:
-z,-n,=,!= - Tests nombres:
-eq,-ne,-lt,-gtou(( )) - Opérateurs logiques:
&&,||,! casepour les choix multiples- Toujours mettre les variables entre guillemets
"$var"