La frapper shell fournit une superbe fonctionnalité lorsqu’il s’agit d’écrire des scripts. Cela inclut de nombreuses façons de parcourir une pile de données afin que vous puissiez en faire beaucoup avec une seule exécution d’un script. Que vous parcouriez un grand groupe de valeurs numériques, de jours de la semaine, de noms d’utilisateur, de mots, de fichiers ou de tout autre chose, frapper a une option qui peut vous faciliter la tâche.
boucles for, while et until
La première chose que vous devez savoir sur la mise en boucle frapper est qu’il existe plusieurs commandes de base à utiliser. La tandis que loop bouclera tant qu’une condition particulière est vraie. La jusqu’à boucle bouclera jusqu’à ce qu’une condition devienne vraie, et le pour boucle parcourra une série de valeurs quelle que soit leur origine.
Par exemple, en utilisant tandis quevous pouvez boucler pendant qu’un nombre est inférieur à 100, parcourir les jours restants du mois comme indiqué dans le script ci-dessous (dans lequel nous saisissons le jour actuel à l’aide de la Date commande et le dernier jour de la dernière chaîne dans la sortie de la cal commande) ou bouclez quelque chose de complètement différent.
#/bin/bash # day of month day=`date | awk '{print $3'}` # number of days in month numdays=`cal | tail -2 | head -1 | awk '{print $NF}'` while [ $day -le $numdays ] do echo $day ((day++)) done
Lorsque nous exécutons ce script, nous devrions voir quelque chose comme ceci :
$ remaining_days 27 28 29 30
Ce script suivant boucle jusqu’à ce qu’un collègue se connecte. Tant que le nombre de connexions de l’utilisateur est égal à zéro (c’est-à-dire qu’il n’est pas connecté), nous affichons « en attente », puis attendons encore 60 secondes. Une fois l’utilisateur connecté, le tandis que boucle est quittée et, dans les 60 secondes suivantes, un message s’affiche confirmant la présence de l’utilisateur connecté.
#!/bin/bash echo -n "user to wait for> " read user while [ `who | grep $user | wc -l` == 0 ] do echo waiting sleep 60 done echo $user is online
La jusqu’à version en boucle du script est très similaire.
#!/bin/bash echo -n "user to wait for> " read user until [ `who | grep $user | wc -l` -gt 0 ] do echo waiting sleep 60 done
Dans pour boucles, nous parcourons une série de valeurs, mais il existe de nombreuses commandes que vous pouvez utiliser pour générer ces valeurs.
La tandis que et jusqu’à les commandes sont expliquées plus en détail dans Comment répéter une commande Linux jusqu’à ce qu’elle réussisse
Boucler les lettres et les chiffres
Vous pouvez parcourir une chaîne de chiffres ou de lettres en spécifiant une plage de valeurs dans la {commencer arrêter} format comme dans les exemples ci-dessous. Notez que vous pouvez commencer avec n’importe quelle valeur. Vous n’êtes pas obligé de commencer par un « a » ou un « 0 ».
$ for letter in {a..f}; do echo $letter; done a b c d e f
Dans cet exemple suivant, nous commençons par 5, pas 1, et évitons les retours chariot avec un écho -n commande.
$ for number in {5..11}; do echo -n "$number "; done 5 6 7 8 9 10 11 $
Vous pouvez même inverser l’ordre des chiffres ou des lettres si vous le souhaitez. Voici quelques exemples :
$ for letter in {z..x}; do echo $letter; done z y x
$ for number in {11..7} > do > echo $number > done 11 10 9 8 7
En boucle pour toujours
Le moyen le plus simple de boucler pour toujours est d’utiliser un “alors que c’est vrai” boucle. La boucle ne s’arrêtera que si vous la tuez – par exemple, avec un ^ C. S’il est inclus dans un script qui s’exécute en arrière-plan, vous pouvez utiliser un tuer commande (par exemple, kill 654321) pour terminer le script.
$ while true > do > echo Hello > sleep 60 > done Hello Hello ^C
Plus d’informations sur la boucle permanente sont disponibles sur Comment boucler pour toujours dans bash sous Linux.
Échapper aux boucles avec pause et continuer
La Pause et Continuez Les commandes vous permettent de sortir entièrement d’une boucle (Pause) ou recommencer en haut de la boucle (Continuez), en sautant toutes les commandes entre le Continuez commande et la fin de la boucle.
La Pause et Continuez les commandes sont expliquées plus en détail sur Utilisation de break et continue pour quitter les boucles.
La plier La commande peut être utilisée pour diviser un fichier ou une chaîne en morceaux de même taille. La longueur par défaut est de 80 caractères. Dans cet exemple, nous divisons la chaîne en blocs de 11 caractères avec -c11 (11 caractères).
$ fold -c11 trythis This file h as a few ri diculously long charac ter strings . Oh, well.
Lorsque vous utilisez le plier commande dans un pour boucle, cependant, vous devez vous rappeler que toute chaîne de caractères résultante contenant un blanc entraînera une ou plusieurs boucles supplémentaires car pour pauses sur chaque chaîne séparée par des blancs.
$ for line in `fold -c10 trythis` > do > echo -n "$line" > echo -n ":" > echo $line | wc -c > done This:5 file:5 has:4 a:2 few:4 ridiculous:11 ly:3 long:5 ch:3 aracter:8 st:3 rings.:7 Oh,:4 well.:6
Plus sur le plier la commande se trouve sur Utiliser le pli pour rendre le texte plus lisible et Utilisation de la commande fold pour piloter des boucles.
Boucler mot à mot
Pour parcourir une liste de mots à l’aide d’un pour boucle, vous pouvez exécuter une commande comme celle ci-dessous. Notez que l’apostrophe doit être échappée pour ne pas être interprétée comme le début d’une chaîne.
$ for word in all's well that ends well; do echo $word; done all's well that ends well
Si vous souhaitez parcourir les mois de l’année, vous pouvez utiliser une commande comme celle-ci :
$ for month in `locale mon | sed 's/;/ /g'`; do echo $month; done January February March April May June July August September October November December
La commande ci-dessus utilise le lieu commande pour obtenir une liste de mois et sed pour diviser la ligne séparée par des points-virgules en mois individuels.
Emballer
Boucler dans des scripts et sur la ligne de commande sous Linux est clairement l’une des meilleures techniques pour faire beaucoup de choses en peu de temps et avec le moins d’effort, surtout si vous transformez vos boucles en scripts que vous pouvez exécuter aussi souvent au besoin sans avoir à réfléchir à tous les détails à chaque fois.
Copyright © 2022 IDG Communications, Inc.