Objectifs
- Utiliser des variables pour stocker des données et des arguments pour rendre les scripts configurables.
- Poser des questions et tester des conditions avec la structure
[[ ... ]]. - Contrôler le flux d’exécution d’un script avec
if,elif, etelse.
Pour qu’un script soit plus qu’une simple liste de commandes, il doit pouvoir prendre des décisions. C’est le rôle des variables et des structures conditionnelles.
Variables et Arguments
- Variables : Permettent de stocker une information.
VERSION="1.0" - Arguments (
$1,$2, …) : Permettent de passer des informations au script lors de son lancement../mon_script.sh premier_arg deuxieme_arg$1contiendra “premier_arg”.$#contiendra le nombre d’arguments (ici, 2).
#!/usr/bin/env bash
set -e
# On vérifie si un argument a été fourni
if [[ "$#" -eq 0 ]]; then
echo "Erreur : un nom de fichier est requis."
exit 1 # On quitte le script avec un code d'erreur
fi
# On stocke le premier argument dans une variable nommée
INPUT_FILE="$1"
echo "Traitement du fichier : $INPUT_FILE"
Les conditions avec [[ ... ]]
La structure [[ ... ]] est la manière moderne et sûre en Bash de poser une question qui renverra “vrai” ou “faux”. On l’utilise presque toujours avec un if.
Tests courants
-
Tests sur les chaînes de caractères
[[ "$A" == "$B" ]]: Les chaînes sont-elles égales ?[[ -z "$VAR" ]]: La variable est-elle vide (zero-length) ?[[ -n "$VAR" ]]: La variable n’est-elle pas vide ?
-
Tests sur les nombres
[[ "$A" -eq "$B" ]]: Égal (EQuals).[[ "$A" -ne "$B" ]]: Non égal (Not Equal).[[ "$A" -gt "$B" ]]: Plus grand que (Greater Than).[[ "$A" -lt "$B" ]]: Plus petit que (Less Than).[[ "$A" -ge "$B" ]]: Plus grand ou égal.[[ "$A" -le "$B" ]]: Plus petit ou égal.
-
Tests sur les fichiers
[[ -f "$FICHIER" ]]: Existe et est un fichier ?[[ -d "$DOSSIER" ]]: Existe et est un dossier ?[[ -e "$CHEMIN" ]]: Le chemin existe (fichier ou dossier) ?
La structure if / elif / else
Cette structure permet d’exécuter différents blocs de code en fonction du résultat d’une condition.
#!/usr/bin/env bash
set -e
read -p "Entrez un nombre : " NOMBRE
if [[ "$NOMBRE" -gt 100 ]]; then
echo "C'est un grand nombre !"
elif [[ "$NOMBRE" -eq 42 ]]; then
echo "C'est la réponse universelle."
elif [[ "$NOMBRE" -lt 10 ]]; then
echo "C'est un petit nombre."
else
echo "C'est un nombre moyen."
fi
if: Le premier test.elif(else if) : Si le test précédent est faux, on essaie celui-ci. On peut en avoir plusieurs.else: Si aucun des tests précédents n’est vrai, on exécute ce bloc.fi: Marque la fin du blocif.
Bonnes pratiques
- Validez toujours vos arguments au début du script. Vérifiez le nombre (
$#) et si les fichiers attendus existent (-f). - Citez vos variables (
"$VAR") dans les tests pour éviter les erreurs. - Utilisez les opérateurs numériques (
-eq,-gt…) pour les nombres et les opérateurs de chaînes (==) pour le texte.
Pièges courants
- Oublier les espaces : La structure
[[ ... ]]est sensible aux espaces.[[ "$A"=="B" ]]est une erreur. Il faut[[ "$A" == "$B" ]]. - Mauvais opérateurs de comparaison :
if [[ "10" > "2" ]]est vrai, car>compare alphabétiquement (“1” vient avant “2”). Pour les nombres, il faut absolument utiliser-gt.
Exercices
-
Vérificateur de permission :
- Écrivez un script
verifier.shqui prend un nom de fichier en argument. - Le script doit afficher un message différent selon que :
- Le fichier n’existe pas.
- Le fichier existe mais n’est pas lisible.
- Le fichier existe et est lisible.
- Indice :
[[ -r "$FICHIER" ]]teste la permission de lecture.
- Écrivez un script
-
Script de salutation avancé :
- Écrivez un script
saluer.shqui prend un nom en argument. - Si l’argument est “root”, le script doit afficher “Attention, vous êtes super-utilisateur.”
- Si l’argument est votre propre nom d’utilisateur (
$USER), il doit afficher “Bonjour, maître.” - Dans tous les autres cas, il doit afficher “Bonjour, [nom].”
- Écrivez un script
-
Jeu “Plus ou Moins” :
- Écrivez un script qui définit une variable
NOMBRE_SECRETà 42. - Le script demande à l’utilisateur de deviner un nombre.
- Utilisez
if/elif/elsepour lui dire si son nombre est plus grand, plus petit, ou égal au nombre secret.
- Écrivez un script qui définit une variable