Apprenez en lisant dans l'ordre

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
De la comparaison au branchement
[ "$count" -lt 5 ]code de sortie 0code de sortie 1bloc thenbloc elsesi vraisi fauxvrai (0)faux (1)
[ ... ] renvoie le code de sortie 0 si vrai et 1 si faux ; if exécute then si vrai et else si faux.
SyntaxSensExample
[ "$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 ]

Écris un script qui prend un nombre et une chaîne comme arguments et branche selon leurs valeurs.

① Ouvre compare.sh avec vi compare.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Récupère le premier argument $1 comme nombre, teste-le avec -lt contre une valeur, et affiche un message différent quand il est plus petit et quand il ne l'est pas.

③ Récupère ensuite le second argument $2 comme chaîne, teste-le avec = contre un mot, et affiche un message différent quand il correspond et quand il ne correspond pas.

④ Appuie sur Esc, enregistre avec :wq, ajoute la permission d'exécution, puis lance-le avec des arguments comme ./compare.sh 3 dev.

⑤ Change les arguments pour ./compare.sh 8 prod et confirme que la branche empruntée change.

⑥ Si tu ne sais pas quoi écrire, copie le texte du panneau de réponse et colle-le dans le mode insertion de vi. (Exécute-le correctement pour révéler l'explication.)

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

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
Types de tests de fichiers
le chemin à tester[ -f path ][ -d path ][ -e path ]vrai si fichierréguliervrai sirépertoirevrai s'ilexistetype de testce qui le rend vrai
-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.
SyntaxSensExample
[ -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

Écris un script de vérification qui branche selon l'existence d'un fichier et d'un dossier.

① Ouvre setup.sh avec vi setup.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Teste le fichier cible avec [ -f ... ] et affiche que tu l'utilises s'il existe, ou que tu crées un défaut sinon.

③ Teste ensuite un dossier de logs avec [ -d ... ] et affiche un message pour chaque cas.

④ Appuie sur Esc, enregistre avec :wq, puis ajoute la permission d'exécution.

⑤ Lance le script et confirme que les résultats de vérification sont affichés.

⑥ Si tu ne sais pas quoi écrire, copie le texte du panneau de réponse et colle-le dans le mode insertion de vi.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

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)
Flux if / elif / else
if [ A ]bloc Aelif [ B ]bloc Belsebloc de replivraifauxvraifauxvérifié de haut en basseule la 1re branche vraie
En partant de 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.
SyntaxSensExample
if cond; then … fiexécute quand la condition est vraieif [ -f f ]; then echo ok; fi
thendémarre le corps quand c'est vraiif [ -f f ]; then echo ok; fi
elif cond; then …essaie la suivante quand la précédente est fausseelif [ "$n" -lt 5 ]; then …
else …exécute quand aucune n'est vraieelse echo other; fi
fiferme le ifif …; then …; fi

Écris un script de vérification qui change son message selon un compteur.

① Ouvre check.sh avec vi check.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Mets en place une variable contenant un nombre, puis utilise if / elif / else pour afficher des messages différents pour -eq 0, pour -lt une petite valeur, et pour tout le reste.

③ Appuie sur Esc, enregistre avec :wq, puis ajoute la permission d'exécution.

④ Lance le script et confirme quelle branche il emprunte.

⑤ Si tu ne sais pas quoi écrire, copie le texte du panneau de réponse et colle-le dans le mode insertion de vi.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...

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
Aiguillage case
case "$action" instart)stop)*)start action ;;stop action ;;repli ;;correspondance de motifaction correspondante (;;)
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.
SyntaxSensExample
case x in pat) … ;; esacaiguille une valeur vers plusieurs motifscase "$1" in start) … ;; esac
pat)un motif comparé à la valeurstart) echo go ;;
;;fin de chaque action de casstart) echo go ;;
*)le cas sans correspondance*) echo other ;;
esacferme le casecase x in …; esac

Écris un script de contrôle qui prend un nom d'action comme argument et aiguille selon sa valeur.

① Ouvre service.sh avec vi service.sh, appuie sur i pour passer en mode insertion, et écris #!/bin/sh sur la première ligne.

② Récupère le premier argument $1 comme nom d'action, et avec case aiguille-le vers trois motifs — start, stop, et tout le reste (*) — en affichant un message différent pour chacun. Termine chaque branche par ;; et ferme avec esac.

③ Appuie sur Esc, enregistre avec :wq, ajoute la permission d'exécution, puis lance-le avec un argument comme ./service.sh start.

④ Change l'argument pour ./service.sh stop ou ./service.sh restart et confirme que le motif correspondant change.

⑤ Si tu ne sais pas quoi écrire, copie le texte du panneau de réponse et colle-le dans le mode insertion de vi.

Linux console
0 / 3 exécutée(s)
Loading Linux Terminal...
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Que teste [ -f config.txt ] ?

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 ?