Salut à tous, c'est Florian du site ITKone, bienvenue dans cette nouvelle vidéo dédiée au
scripting bash où nous allons apprendre à utiliser les boucles FOR qui vont également
permettre de faire ce que l'on pourrait appeler des boucles FOREACH. Les boucles FOR vont être
très intéressantes pour automatiser l'exécution de tâches répétitives, notamment sur un ensemble
d'éléments. Cela peut être sur toutes les lignes d'un fichier ou un certain nombre de fois
etc. en fonction des besoins. Cette vidéo est la troisième sur le sujet du scripting bash
j'espère qu'elle vous plaira. Avant de regarder la suite, pensez à vous abonner à la chaîne
YouTube ITKonect. Nous allons voir qu'en scripting bash, il y a deux syntaxes différentes pour
utiliser les boucles FOR. D'ailleurs, cette première syntaxe présente à l'écran correspond
en quelque sorte à du FOREACH puisqu'on va pouvoir parcourir par exemple l'ensemble des
lignes d'un fichier sans faire d'efforts particuliers en termes de syntaxe. Ce que
l'on va tout simplement écrire, c'est déjà le mot clé FOR. C'est toujours ce mot clé, peu
importe la syntaxe qu'on va utiliser. Derrière, on va définir une variable qui va être propre à la
boucle et qui va nous permettre de parcourir les éléments les uns après les autres. Ensuite
IN et derrière on met notre liste d'éléments. Cela peut être simplement une liste de quelques
valeurs ou un fichier, ce qui va permettre de dire à la boucle FOR qu'elle doit parcourir
l'intégralité des lignes du fichier. Dans ce cas, on va partir de la première ligne
on va aller jusqu'à la dernière et on va pouvoir appliquer une action de façon répétitive sur
l'ensemble des éléments. Une fois qu'on a écrit cette première ligne, on va venir mettre le DOO
et à la fin le DONE. Entre le DOO et le DONE, on va venir écrire l'ensemble du code que l'on
veut exécuter pour chaque élément à traiter. C'est la première syntaxe d'une boucle FOR. Si
l'on essaie de la mettre en pratique assez rapidement, voici un script très basique
On a FOR i, et dans ce cas-là le i sera la variable que je vais pouvoir utiliser à l'intérieur de la
boucle IN. Je définis un tableau de valeur de 1 jusqu'à 5. On va simplement écrire étape numéro
$i, c'est-à-dire étape numéro 1, numéro 2, etc. jusqu'à 5, en principe compte tenu du
fonctionnement d'une boucle FOR. On va pouvoir exécuter ce premier script comme ceci. J'ai bien
le retour étape numéro 1, numéro 2, etc. jusqu'à la 5. Une fois qu'on est arrivé à la fin de la
liste d'éléments, la boucle s'arrête. Comme je n'ai rien d'autre dans mon script, on voit que j'ai
bien le retour console qui apparaît à l'écran. Nous allons voir maintenant la seconde syntaxe
possible. Dans ce cas-là, on va partir toujours avec le mot clé FOR, et on va avoir entre double
parenthèse trois valeurs à indiquer. Déjà c'est l'état initial, typiquement le $i qui est égal à 1
ou à 0, c'est souvent ce qu'on fait dans les boucles FOR dans les différents langages. Point
virgule la condition de répétition, c'est à dire une condition à évaluer qui va permettre de
déterminer si oui ou non on doit continuer à exécuter le bloc de code présent dans la boucle
ou au contraire si on doit sortir de la boucle. Point virgule l'élément à incrémenter à chaque
itération. On va avoir une variable qui va être notre état initial, que l'on va incrémenter �
chaque itération, c'est à dire à chaque tour de boucle, de manière à un moment donné à pouvoir
sortir, puisqu'on va évaluer cette variable au niveau de la condition de répétition. Si on
reprend exactement le même principe que ce que je viens de vous montrer tout à l'heure avec le
FOREACH, où on a fait étape numéro 1 jusqu'à 5, si on veut obtenir le même résultat avec cette
seconde syntaxe, voici le code que l'on doit écrire. On voit que c'est un peu plus lourd en
termes de syntaxe, mais on obtiendra strictement le même résultat. On définit la variable $i qui
est égale à 1 dès le départ. On va à chaque fois faire plus 1 sur cette variable, d'où le i++
qui va permettre d'incrémenter de 1 la variable à chaque itération. Ici c'est la condition de
répétition, donc il faut que i soit inférieur ou égal à 5 pour qu'on continue à itérer la boucle
Si on exécute ce script, on va voir qu'on obtient exactement le même résultat que tout à l'heure
D'ailleurs vous avez la sortie des deux méthodes et on a exactement la même chose, c'est simplement
une histoire d'écriture. Après c'est une histoire d'écriture, mais tout dépend de ce qu'on veut
faire. Il y a des cas où on va directement s'orienter vers le FOREACH, notamment si on
veut parcourir l'intégralité d'un fichier. Ce sera beaucoup plus simple que d'utiliser une boucle
FOR tel que je viens de vous la montrer. Voici un exemple autour de cette notion de fichier
puisque là on va prendre la liste de tous les fichiers .txt présents dans le dossier
Home Flow Documents, et on va exécuter une action sur chacun de ces fichiers. On va pouvoir traiter
de façon répétitive un ensemble de fichiers. J'ai ma variable fichier qui sera interne à la boucle
et on va compter le nombre de lignes dans chacun de ces fichiers. C'est une action très basique
mais ça vous montre un peu le potentiel des boucles FOREACH en scripting batch. J'ai mon
dollar fichier pour rappeler le nom de mon fichier et pour l'afficher à l'écran. Entre le dollar
la parenthèse qui est là et la parenthèse qui est là, ça me permet d'avoir à l'intérieur de ce
bloc une expression à exécuter. Je vais exécuter la commande CAT pour afficher le contenu du fichier
Le pipeline je l'envoie à wc-l pour compter le nombre de lignes et l'afficher à l'écran
Et nous verrons que toute cette partie du script sera remplacée simplement par un nombre de lignes
Donc on va exécuter ce petit script là, et j'ai bien l'ensemble de mes fichiers .txt présents
dans ce dossier. Apparemment il y en a cinq, et à chaque fois j'ai le nombre de lignes qui apparaît
Du coup on pourrait s'amuser même à vérifier, par exemple si on prend le fichier numéro 3
on l'affiche. Alors effectivement il a bien une, deux, trois lignes, ce qui a bien été retourné ici
Et donc on a pu faire cette action répétitive. On aurait pu faire totalement autre chose
mais on a vraiment fait une action répétitive sur un ensemble de fichiers que l'on a souhait�
traiter. Je vais vous présenter un autre exemple basé sur la manipulation de fichiers, où cette
fois-ci nous allons prendre la liste de tous les fichiers .txt présents dans le répertoire courant
Donc on voit bien ici que je n'ai pas précisé de chemin complet, ce qui veut dire qu'on va prendre le répertoire courant dans lequel on se situe au niveau du shell bash. Et donc on va faire une
action de renommage, c'est à dire qu'on va prendre chaque fichier et on va le renommer en lui ajoutant
le préfixe ITCONNECT. On pourrait renommer en masse des fichiers avec un tel script
Donc là c'est un exemple très simple, une nouvelle fois où j'ai simplement rajouté ITCONNECT, mais ça évite de le faire à la main. Dans ce fichier là, qu'est-ce que j'ai ? J'ai
un document 1, un document 2, jusqu'à 5. On va maintenant exécuter ce fameux script
donc qui est celui-ci. Et en principe il n'y a aucun retour console, ce qui est normal
je n'ai pas inclus de écho dans ma boucle. Mais maintenant si je refais un ls, j'ai bien pour le
coup l'ensemble de mes documents qui ont été renommés avec ITCONNECT, donc c'est bien le
préfixe que j'ai souhaité ajouter. Je n'ai pas eu à le faire à la main, donc là j'aurais eu 200
fichiers à traiter, ça l'aurait fait très rapidement alors qu'à la main ça aurait été relativement pénible. Donc on voit bien ici l'intérêt d'une boucle fort pour automatiser
l'exécution de tâches répétitives. Nous allons étudier un autre exemple, toujours dans cette
idée de vous montrer un petit peu le potentiel de tout ça. Ici j'ai défini un tableau dans la
variable SERVICE qui contient deux noms de services SSH et APACHE2. On voit en même temps
que dans un tableau, entre parenthèses, on met les valeurs, on les sépare par un espace. L'objectif
va être de parcourir ce tableau pour redémarrer de façon automatique les services qui sont présents
dans ce tableau. On peut imaginer que c'est très intéressant sur un serveur quand on veut
l'administrer. Si on a besoin de redémarrer un ensemble de services, plutôt que d'enchaîner
à la main toutes les commandes en changeant le nom du service à chaque fois, on se fait un petit
script comme ça. On lance le script et derrière c'est lui qui va s'occuper de redémarrer les
services dans l'ordre tel qu'ils sont précisés dans la variable SERVICE. Je mets ici SERVICE
sans S qui sera ma variable à l'intérieur de la boucle. Je vais parcourir l'ensemble de mon
tableau. C'est pour ça qu'ici j'ai utilisé cette syntaxe avec le arrow base pour sélectionner
l'ensemble des éléments du tableau. Cela va retourner tous les éléments. Le écho pour avoir
une petite phrase de suivi dans la console et on va un système CTL restart derrière le nom du
service. Je pourrais soit mettre le sudo directement ici ou je peux mettre le sudo quand je vais
le dire directement appelé le script. Comme ça, cela va me permettre d'avoir l'élévation de
privilèges nécessaire pour redémarrer les services. Cela me demande bien le mot de passe, donc cela nous permet de voir aussi en même temps le fait que l'on puisse utiliser sudo pour
exécuter un script qui nécessite une élévation de privilèges. Là j'ai bien eu un redémarrage de
mes services. J'ai le suivi directement dans la console qui est plutôt intéressant. Pour finir
voici un dernier exemple. Nous allons mixer l'utilisation de la boucle fort avec les
structures conditionnelles if-else. L'idée ici c'est toujours d'avoir notre liste de services
avec simplement deux services. On va parcourir cette liste de services et on va vérifier l'état
de chacun des services présents dans notre tableau. L'idée c'est de faire un if. La condition du if
c'est systèmectl isActive de façon silencieuse. Le if tel qu'il est écrit ici va permettre de
vérifier que le service est actif et on ne va rien retourner dans la console. C'est pour ça que j'ai
rajouté le quiet. Si le service est actif, on retourne le service est actif en mettant le nom
du service. Sinon, c'est qu'il est inactif. On va pouvoir exécuter ce script. J'ai donc bien
vérification de l'état du service SSH. Le service SSH est actif et la même chose pour Apache 2
A chaque fois j'ai le retour console, puisque j'ai bien une phrase qui était ici pour l'ensemble
de mes services à traiter. Ensuite, en fonction de l'état du service en lui-même, on va retourner
une valeur qui sera différente. Dans le cas présent, au niveau du if, on voit que je n'ai
pas mis de crochet au niveau de la condition. C'est normal, sinon ça renverrait une erreur
vis-à-vis du test qui a été fait dans le cas présent. Cela permet aussi de voir cette possibilité
J'espère que cette vidéo vous a plu ! Après l'avoir regardée, vous êtes prêts à mettre
en pratique les boucles forts en scripting bash. N'hésitez pas à aller sur le site itconnect.fr
puisque vous pouvez retrouver l'ensemble des articles sur le scripting bash, et aussi l'ensemble
des exemples, ce qui vous permet de faire des copier-coller éventuellement des scripts que
je vous présente, pour les tester de votre côté, ou pour les améliorer, les adapter à vos besoins
N'hésitez pas à commenter cette vidéo, à me dire ce que vous en pensez, à la partager également
et puis je vous dis à très vite ! Ciao