Les scripts Bash sont un moyen très efficace d'automatiser les tâches, en particulier celles qui tirent parti d'autres programmes existants. Cette automatisation nécessite souvent de répéter plusieurs fois une opération similaire, qui est précisément là où le pour boucle prend tout son sens.
Les administrateurs système Linux et Mac sont généralement familiarisés avec les scripts via le terminal, mais même les utilisateurs de Windows peuvent entrez dans l'action avec le sous-système Windows pour Linux.
Besoin d'utiliser Linux pas le temps de passer à un autre PC ou d'exécuter une VM? Exécutez Linux dans Windows 10 avec un terminal shell Bash à la place!
Fonctionnement des scripts Bash
Un script bash est simplement un fichier texte contenant une série de commandes que le shell bash peut lire et exécuter. Bash est le shell par défaut dans macOS pré-Catalina et dans la plupart des distributions Linux.
Si vous n’avez jamais travaillé avec un script shell auparavant, vous devez commencer par le cas le plus simple. Cela vous permettra de mettre en pratique les concepts clés, y compris la création du script et son exécution.
Tout d'abord, créez le fichier suivant dans un emplacement pratique (idéalement, ouvrez un terminal et accédez d'abord au répertoire souhaité):
#! / bin / bash
echo "Bonjour le monde"
La première ligne indique à tout ce qui exécute ce programme comment l'exécuter (c'est-à-dire en utilisant l'interpréteur bash). La seconde est juste une commande comme toute autre que vous pourriez entrer sur la ligne de commande. Enregistrez ce fichier sous bonjour_world.sh, alors:
$ chmod + x bonjour_world.sh
$ ./hello_world.sh
Le chmod La commande sur la première ligne rend le fichier exécutable, ce qui signifie qu'il peut être exécuté en tapant son nom, comme dans la deuxième ligne.
Si les mots "Hello, World" apparaissent sur une ligne de votre terminal, c'est que tout fonctionne comme prévu.
Comment fonctionnent les boucles
En programmation générale, il existe deux principaux types de boucle for: numérique et pour chaque. Le type numérique est traditionnellement le plus courant, mais dans l’utilisation de bash, c’est généralement l’inverse.
Les boucles for numériques se concentrent généralement sur un seul entier qui détermine le nombre d'itérations à effectuer, par exemple:
pour (i = 0; i <100; i ++) {
/ * instructions à exécuter à plusieurs reprises * /
}
Il s'agit d'une boucle familière pour qui itérera exactement 100 fois, à moins que i ne soit modifié dans la boucle, ou qu'une autre instruction ne provoque l'arrêt de l'exécution de la boucle for.
Les boucles Foreach, en revanche, ont tendance à fonctionner sur des structures telles que des listes ou des tableaux, et à itérer pour chaque élément de cette collection:
people = ["Peter", "Paul", "Mary"]
foreach (personnes en tant que personne) {
if (personne == "Paul") {
...
}
}
Certaines langues utilisent une syntaxe légèrement différente qui permute l'ordre de la collection et de l'élément:
people = ["Peter", "Paul", "Mary"]
pour (personne dans les gens) {
if (personne == "Paul") {
...
}
}
Pour dans les boucles
Dans bash, le foreach - ou pour dans- la boucle est plus courante. La syntaxe de base est, simplement:
pour arg dans [list]
fais
/ * instructions à exécuter à plusieurs reprises * /
/ * la valeur de arg peut être obtenue en utilisant $ arg * /
Fini
Par exemple, pour parcourir trois fichiers nommés explicitement:
pour fichier dans one.c two.c three.c
fais
ls "$ fichier"
Fini
Si de tels fichiers existent dans le répertoire courant, la sortie de ce script sera:
un.c
deux.c
trois.c
Au lieu d'un ensemble fixe de fichiers, la liste peut être obtenue via un modèle global (un comprenant des jokers - des caractères spéciaux qui représentent d'autres caractères). Dans l'exemple suivant, la boucle for effectue une itération sur tous les fichiers (dans le répertoire actuel) dont les noms se terminent par ".xml":
pour fichier en * .xml
fais
ls -l "$ fichier"
Fini
Voici un exemple de sortie:
$ -rw-r - r-- 1 Bobby Staff 2436 3 nov.2019 feed.xml
$ -rw-r - r-- 1 bobby staff 6447 27 oct 16:24 sitemap.xml
Cela peut ressembler beaucoup à une façon de faire de longue haleine:
$ ls -l * .xml
Mais il y a une différence significative: la boucle for exécute le ls programme 2 fois, avec un seul nom de fichier qui lui est passé à chaque fois. Dans l'exemple ls séparé, le modèle glob (* .xml) correspond d'abord aux noms de fichiers, puis les envoie tous, en tant que paramètres de ligne de commande individuels, à une instance de ls.
Voici un exemple qui utilise le toilettes (word count) programme pour rendre la différence plus évidente:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 au total
Le toilettes programme compte le nombre de lignes dans chaque fichier séparément, puis imprime un nombre total sur chacun d'eux. En revanche, si toilettes fonctionne dans une boucle for:
pour fichier en * .xml
fais
wc -l $ fichier
Fini
Vous verrez toujours le décompte pour chaque fichier:
44 feed.xml
231 sitemap.xml
Mais il n'y a pas de total récapitulatif global car toilettes est exécuté de manière isolée, à chaque itération de la boucle.
Lorsqu'une liste n'est pas une liste
Il y a une erreur très simple et courante lors du traitement des boucles for, en raison de la façon dont bash gère les arguments / chaînes entre guillemets. La lecture en boucle d'une liste de fichiers doit être effectuée comme suit:
pour fichier dans one.c two.c
Pas comme ça:
pour le fichier dans "one.c two.c"
Le deuxième exemple met les noms de fichiers entre guillemets, ce qui donne une liste avec un seul paramètre; la boucle for ne s'exécutera qu'une seule fois. Ce problème peut être évité en utilisant une variable dans de tels cas:
FILES = "one.c two.c"
pour le fichier dans $ FILES
fais
...
Fini
Notez que la déclaration de variable elle-même doit mettre sa valeur entre guillemets!
Pour sans liste
Sans rien à parcourir, une boucle for opère sur les arguments de ligne de commande fournis au script lors de son appel. Par exemple, si vous avez un script nommé args.sh contenant les éléments suivants:
#! / bin / sh
pour un
fais
echo $ a
Fini
Ensuite, exécuter args.sh vous donnera ce qui suit:
$ ./args.sh un deux trois
une
deux
Trois
Bash reconnaît ce cas et traite pour faire comme l'équivalent de pour un dans $ @ do où $ @ est une variable spéciale représentant les arguments de la ligne de commande.
Émulation d'une boucle For numérique traditionnelle
Les scripts bash traitent souvent des listes de fichiers ou des lignes de sortie d'autres commandes, de sorte que le type de boucle for in est courant. Cependant, l'opération traditionnelle de style C est toujours prise en charge:
pour ((i = 1; i <= 5; i ++))
fais
echo $ i
Fini
Il s'agit de la forme classique en trois parties dans laquelle:
- une variable est initialisée (i = 1) lors de la première rencontre de la boucle
- la boucle continue tant que la condition (i <= 5) est vraie
- à chaque fois autour de la boucle, la variable est incrémentée (i ++)
Itérer entre deux valeurs est une exigence assez courante pour qu'il existe une alternative plus courte et un peu moins déroutante:
pour i dans {1..5}
fais
echo $ i
Fini
L'expansion d'accolade qui a lieu traduit efficacement la boucle for ci-dessus en:
pour i dans 1 2 3 4
Contrôle de boucle plus fin avec pause et continue
Les boucles for plus complexes nécessitent souvent un moyen de quitter tôt ou de redémarrer immédiatement la boucle principale avec la valeur suivante à son tour. Pour ce faire, bash emprunte les instructions break et continue qui sont courantes dans d'autres langages de programmation. Voici un exemple qui utilise les deux pour trouver le premier fichier de plus de 100 caractères:
#! / bin / bash
pour fichier en *
fais
si [! -f "$ fichier"]
alors
echo "$ fichier n'est pas un fichier"
Continuez
Fi
num_chars = $ (wc -c echo $ file est "$ num_chars caractères long"
si [$ num_chars -gt 100]
alors
echo "$ fichier trouvé"
Pause
Fi
Fini
La boucle for opère ici sur tous les fichiers du répertoire courant. Si le fichier n'est pas un fichier normal (par exemple, s'il s'agit d'un répertoire), l'instruction continue est utilisée pour redémarrer la boucle avec le fichier suivant à son tour. S'il s'agit d'un fichier normal, le deuxième bloc conditionnel déterminera s'il contient plus de 100 caractères. Si tel est le cas, l'instruction break est utilisée pour quitter immédiatement la boucle for (et atteindre la fin du script).
Conclusion
Un script bash est un fichier contenant un ensemble d'instructions qui peuvent être exécutées. Une boucle for permet à une partie d'un script d'être répétée plusieurs fois. Avec l'utilisation de variables, de commandes externes et des instructions break et continue, les scripts bash peuvent appliquer une logique plus complexe et exécuter un large éventail de tâches.
Le rapport suggère que les étiquettes de confidentialité des applications d'Apple peuvent avoir des problèmes.
- Programmation
- Linux
Bobby est un passionné de technologie qui a travaillé comme développeur de logiciels pendant la majeure partie de deux décennies. Passionné de jeux vidéo, il travaille en tant que rédacteur de critiques chez Switch Player Magazine et est plongé dans tous les aspects de la publication en ligne et du développement Web.
Abonnez-vous à notre newsletter
Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives!
Un pas de plus…!
Veuillez confirmer votre adresse e-mail dans l'e-mail que nous venons de vous envoyer.