Question 1Que teste [ -f config.txt ] ?
Script Shell - Conditions
Teste des fichiers, des chaînes et des nombres avec [ -f config.txt ], [ -z "$name" ] et [ "$count" -lt 5 ], branche avec if / elif / else et aiguille plusieurs motifs avec case — écris et exécute chaque script, illustré dans un terminal en navigateur.
Brancher en comparant des valeurs — comparaisons de chaînes et de nombres
Dans un script shell, tu changes ce qui s'exécute en vérifiant si des chaînes correspondent ou si des nombres sont plus grands.
Pour la vérification, tu utilises la commande test, ou [ ... ], qui fait la même chose.
Les [ et ] ont besoin d'espaces juste à l'intérieur, donc tu écris [ "$count" -lt 5 ].
Une vérification vraie renvoie le code de sortie 0, et une fausse renvoie 1.
Compare des chaînes avec = (égal) et != (différent), et vérifie si c'est vide avec -z (vide) ou -n (non vide).
Compare des nombres avec -eq (égal), -ne (différent), -lt (inférieur à) et -gt (supérieur à), et note que les chaînes et les nombres utilisent des opérateurs différents.
Entoure les variables de guillemets doubles comme dans [ -z "$name" ] — ainsi la syntaxe reste valide même quand la valeur est vide.
count=3
mode="dev"
[ "$count" -lt 5 ] && echo small # 3 est inférieur à 5, donc small
[ "$count" -gt 0 ] && echo positive # supérieur à 0, donc positive
[ "$mode" = "prod" ] || echo other # pas prod, donc other
[ -z "$mode" ] || echo has-mode # pas vide, donc has-mode
[ ... ] renvoie le code de sortie 0 si vrai et 1 si faux ; if exécute then si vrai et else si faux.| Syntax | Sens | Example |
|---|---|---|
[ "$a" = "$b" ] | vrai si les chaînes a et b sont égales | [ "$mode" = "prod" ] |
[ "$a" != "$b" ] | vrai si les chaînes a et b diffèrent | [ "$mode" != "dev" ] |
[ -z "$v" ] | vrai si la variable v est vide | [ -z "$name" ] && echo empty |
[ -n "$v" ] | vrai si la variable v n'est pas vide | [ -n "$name" ] && echo set |
[ "$a" -eq N ] | vrai si le nombre a est égal à N | [ "$count" -eq 0 ] |
[ "$a" -ne N ] | vrai si le nombre a n'est pas N | [ "$count" -ne 0 ] |
[ "$a" -lt N ] | vrai si le nombre a est inférieur à N | [ "$count" -lt 10 ] |
[ "$a" -gt N ] | vrai si le nombre a est supérieur à N | [ "$count" -gt 0 ] |
Vérifier fichiers et dossiers — -f / -d
Dans un script, tu vérifies souvent qu'un fichier de configuration existe ou qu'un dossier de sortie est prêt avant d'aller plus loin.
Teste un fichier avec -f (un fichier régulier existe) et un dossier avec -d (un répertoire existe).
Quand seule l'existence t'importe, peu importe le type, utilise -e, et pour vérifier qu'il n'est pas vide, utilise -s.
Tu écris ces vérifications avec le même [ ... ] que pour les chaînes et les nombres, en passant un chemin comme [ -f config.txt ].
Elles renvoient le code de sortie 0 si vrai et 1 si faux, donc combinées avec if ou && / || tu peux écrire une initialisation du type l'utiliser s'il existe, le créer sinon.
touch report.txt # crée le matériau
[ -f report.txt ] && echo exists # le fichier existe, donc exists
[ -d report.txt ] || echo notdir # pas un répertoire, donc notdir
mkdir logs # crée le dossier
[ -d logs ] && echo hasdir # le répertoire existe, donc hasdir
-f teste un fichier régulier, -d un répertoire, et -e l'existence quelconque. Le même chemin peut donner des résultats différents selon ta question.| Syntax | Sens | Example |
|---|---|---|
[ -f f ] | vrai si f existe comme fichier régulier | [ -f config.txt ] && echo found |
[ -d d ] | vrai si d existe comme répertoire | [ -d logs ] && echo dir |
[ -e p ] | vrai si p existe, de tout type | [ -e data ] && echo there |
[ -s f ] | vrai si f existe et n'est pas vide | [ -s log.txt ] && echo nonempty |
Séparer le flux — if / elif / else
if exécute le bloc then uniquement quand la condition est vraie.
Pour essayer plusieurs conditions à tour de rôle, utilise elif, pour le cas où aucune ne correspond ajoute else, et ferme avec fi.
Sépare les parties par des points-virgules comme dans if condition; then action; fi, ou répartis-les sur plusieurs lignes.
count=3
if [ "$count" -eq 0 ]; then
echo "none"
elif [ "$count" -lt 5 ]; then
echo "few ($count)"
else
echo "many ($count)"
fi # affiche few (3)
if, il essaie chaque condition et n'exécute que la première branche qui devient vraie. Si aucune n'est vraie, il va à else.| Syntax | Sens | Example |
|---|---|---|
if cond; then … fi | exécute quand la condition est vraie | if [ -f f ]; then echo ok; fi |
then | démarre le corps quand c'est vrai | if [ -f f ]; then echo ok; fi |
elif cond; then … | essaie la suivante quand la précédente est fausse | elif [ "$n" -lt 5 ]; then … |
else … | exécute quand aucune n'est vraie | else echo other; fi |
fi | ferme le if | if …; then …; fi |
Aiguiller plusieurs motifs — case
Quand tu compares une valeur à de nombreux candidats, case se lit plus clairement.
Il a la forme case value in pattern) action ;; esac, où tu termines chaque motif par ;; et attrapes le cas sans correspondance avec *).
Il rend l'intention du branchement plus claire qu'empiler de nombreux niveaux de if.
action="start"
case "$action" in
start) echo "starting service" ;;
stop) echo "stopping service" ;;
*) echo "unknown action: $action" ;;
esac # affiche starting service
case compare la valeur aux motifs depuis le haut, n'exécute que la première branche correspondante, et ferme avec esac. *) est le cas sans correspondance.| Syntax | Sens | Example |
|---|---|---|
case x in pat) … ;; esac | aiguille une valeur vers plusieurs motifs | case "$1" in start) … ;; esac |
pat) | un motif comparé à la valeur | start) echo go ;; |
;; | fin de chaque action de cas | start) echo go ;; |
*) | le cas sans correspondance | *) echo other ;; |
esac | ferme le case | case x in …; esac |
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quel mot-clé essaie une autre condition quand la précédente était fausse ?
Question 3Quel symbole marque la fin de l'action de chaque motif dans case ?