Aller au contenu principal

Conditions


Table des matières

  1. Structure if/elif/else
  2. Tests de fichiers
  3. Tests de chaînes
  4. Tests numériques
  5. Opérateurs logiques
  6. Structure case
  7. 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 standardBash étendu
Plus portablePlus de fonctionnalités
Nécessite échappementPattern 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érateurDescription
-e fileExiste
-f fileEst un fichier régulier
-d fileEst un répertoire
-r fileEst lisible
-w fileEst modifiable
-x fileEst exécutable
-s fileTaille > 0
-L fileEst un lien symbolique
f1 -nt f2f1 plus récent que f2
f1 -ot f2f1 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érateurDescription
-z strChaîne vide
-n strChaîne non vide
str1 = str2Égalité
str1 != str2Différence
str1 < str2Avant (alphabétique)
str1 > str2Aprè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érateurSignification
-eqÉgal
-neNon égal
-ltInférieur (less than)
-leInférieur ou égal
-gtSupérieur (greater than)
-geSupé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érateurDescription
! exprNON (négation)
expr1 -a expr2ET
expr1 -o expr2OU
# 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érateurDescription
! exprNON
expr1 && expr2ET
expr1 || expr2OU
# 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, -gt ou (( ))
  • Opérateurs logiques: &&, ||, !
  • case pour les choix multiples
  • Toujours mettre les variables entre guillemets "$var"

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Boucles →