GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Scripting - Boucle While And Until expliquée avec des exemples

Ceci est un article de continuation dans la boucle bash dans lequel l'article précédent que nous avons expliqué à propos de la boucle for . Dans cet article, nous examinerons deux autres boucles bash, à savoir while et until boucle.

Le while La boucle est principalement utilisée lorsque vous devez lire le contenu du fichier et le traiter ultérieurement. La lecture et l'écriture dans un fichier sont des opérations courantes lorsque vous écrivez des scripts bash. Nous allons voir comment lire des fichiers avec un while boucle.

Nous avons déjà un article très détaillé sur la façon d'écrire dans un fichier en utilisant les opérateurs de redirection.

  • La redirection bash expliquée avec des exemples

La fonctionnalité du while la boucle est similaire à for boucle. Le for boucle itère sur une liste d'éléments et exécute le bloc de code N un certain nombre de fois. Ici dans le while boucle, la condition est évaluée en premier, et si la condition est vraie, le bloc de code sera exécuté jusqu'à ce que la condition soit évaluée comme fausse.

1. Boucle While

Ci-dessous le while syntaxe de boucle. La boucle commence par le "while" mot-clé suivi d'une condition qui doit être évaluée comme vraie. Entre do et done le bloc est l'endroit où seront placés vos codes qui seront itérés N fois.

tandis que [[ condition ]]do Commande 1 Commande 2 .... Commande 3done

EXEMPLE 1 - Évaluer et itérer

Jetez un oeil à l'exemple ci-dessous. Ici j'ai créé une variable "NUM=5" et mon état ($NUM -ne 0 ) est, la boucle s'exécutera si la variable NUM n'est pas égal à zéro.

$ NUM=5while [[ $NUM -ne 0 ]]do printf "Valeur de NUM =$NUM \n" ((--NUM))done

Vous devez utiliser des compteurs pour incrémenter ou décrémenter les valeurs stockées dans les variables lorsque vous travaillez avec while boucles. Sinon, cela deviendra une boucle infinie et NUM sera toujours fixé à cinq. Ici, je décrémente la valeur de NUM à chaque itération en exécutant ((--NUM)) , donc quand ma variable NUM est mis à zéro, la boucle sort.

((++NUM)) → Incrémente la variable NUM de 1, similaire à l'exécution de NUM=$(( $NUM + 1 ))((--NUM)) → Décrémente la variable NUM de 1, similaire à l'exécution de NUM=$(( $NUM - 1 ))

EXEMPLE 2 - Boucles infinies

Une boucle infinie est l'endroit où votre condition est toujours évaluée comme vraie et la boucle ne se terminera jamais.

Pour créer des boucles infinies, vous pouvez utiliser le bash-builtin true mot-clé. Utilisez également le "sleep" lors du test de boucles infinies, ce qui vous donnera le contrôle de l'arrêt du script, sinon votre écran sera inondé de sorties à défilement rapide.

$ NUM=0while truedo printf "Valeur de NUM =$NUM \n" ((++NUM)) sleep 2done

EXEMPLE 3 - Séparateur de champ interne (IFS)

IFS est une variable shell spéciale qui décide de la manière dont vos limites de mots sont gérées. Par défaut, IFS est défini sur un espace, une tabulation et un caractère de saut de ligne. Ouvrez le terminal et exécutez les commandes suivantes :

$ var1="foo:bar foo bar"
$ pour val dans $var1do echo $valdone 

Jetez un oeil à la sortie. Le for loop itère sur une chaîne et c'est IFS qui décide des limites des mots et considère l'espace comme un séparateur de champs.

Maintenant, exécutez à nouveau le code ci-dessous. Ici, IFS est défini sur les deux-points .

$ var1="foo:bar foo bar"
$IFS=":"
$ pour val dans $var1do echo $valdone

À partir de la sortie ci-dessus, vous pouvez voir que les deux-points du séparateur de champ personnalisé sont utilisés comme limite de mot. Vous pouvez remettre l'IFS à l'état par défaut en exécutant le unset commande.

$ IFS non défini

EXEMPLE 4 - Lire un fichier à l'aide de la boucle while

Le while loop est recommandé lorsque vous souhaitez lire un fichier ligne par ligne et le traiter.

Créez un nouveau fichier appelé test.txt en utilisant le contenu suivant. Il y a une ligne vide après la ligne 2 pour montrer le comportement de la gestion des lignes vides.

14h00 Brighton contre Leicester14h00 West Ham contre Man Utd16h30 Spurs contre Chelsea

Nous utiliserons le read commande qui accepte l'entrée de la redirection et la stocke dans une variable avec un opérateur de redirection d'entrée où le nom du fichier sera redirigé vers le while boucle. Le read utilisera l'IFS par défaut pour définir la limite de division du mot.

$ while read linedo echo $linedone   

Dans l'exemple ci-dessus, test.txt le fichier est redirigé vers le while boucler et read la commande lit ligne par ligne et la stocke dans la variable "line" et il est ensuite traité dans la boucle. Les lignes vides ne sont pas ignorées lorsque vous suivez cette méthode et ce n'est pas le comportement que vous pourriez souhaiter. Vous devez donc explicitement créer des lignes vides à ignorer.

Il existe plusieurs options pour supprimer les lignes vides du fichier d'entrée. Vous pouvez utiliser sed , awk , et les instructions conditionnelles, etc. Je préfère utiliser à la fois awk et sed pour nettoyer les lignes vides avant de les boucler en utilisant un while boucle.

# USING SED$ sed -i '/^[[:space:]]*$/d' test.txt14:00 Brighton v Leicester14:00 West Ham v Man Utd16:30 Spurs v Chelsea
# UTILISER AWK$ awk 'NF' test.txt

Comme vu dans les exemples précédents, vous pouvez modifier IFS en fonction de la manière dont vous souhaitez lire votre fichier. Par exemple, si vous manipulez un fichier CSV, le délimiteur peut être défini sur une virgule. J'ai modifié le même fichier d'entrée pour qu'il soit au format CSV.

14:00,Brighton,Leicester14:00,West Ham,Man Utd16:30,Spurs,Chelsea

Dans l'exemple ci-dessous, IFS est défini sur une virgule (IFS="," ) et chaque champ sera stocké dans une variable distincte (heure, équipe1, équipe2).

tandis que IFS="," lire heure équipe1 équipe2 do echo "$team1 joue contre $team2 à $time"done   

EXEMPLE 5 - Contrôle de flux de boucle avec Break and Continue

Si vous avez lu notre article bash for loop, vous savez peut-être ce qu'est break et continuer utilisé pour. break et continue sont des mots-clés intégrés bash qui vous aideront à contrôler le flux de votre boucle.

Le mot-clé "break" sortira complètement de la boucle et passera le contrôle à la commande suivante du script. Dans l'exemple ci-dessous. Lorsque le NUM est égal à trois, la boucle sera sortie par le break commande.

$ NUM=5while [[ $NUM -ne 0 ]]do printf "Valeur de NUM =$NUM \n" if [[ $NUM -eq 3 ]] then break fi ((--NUM))done  

Le mot-clé "continue" ignorera l'itération en cours et redonnera le contrôle à la boucle while et commencera l'itération suivante.

$ NUM=0while [[ $NUM -lt 5 ]]do ((++NUM)) if [[ $NUM -eq 3 ]] then continue fi printf "Valeur de NUM =$NUM \n" done  

2. Jusqu'à la boucle

Le until boucle est l'exact opposé du while boucle. Le while loop évalue la condition comme étant vraie pour exécuter le bloc de code et le until loop évalue la condition comme étant fausse pour que la boucle soit exécutée.

La syntaxe est la même que le while boucle mais à la place du mot-clé while , until sera utilisé.

jusqu'à ce que [[ condition ]]do Commande 1 Commande 2 .... Commande 3done

Dans l'exemple ci-dessous, vous pouvez voir until la boucle évalue la variable NUM être supérieur ou égal à cinq. C'est faux puisque NUM est mis à zéro et s'incrémentera dans les itérations suivantes en utilisant ((++NUM)) . Ainsi, lorsque NUM est égal à cinq, la condition est évaluée comme vraie et until la boucle cessera de s'exécuter.

NUM $=0
$ jusqu'à [[ $NUM -ge 5 ]]faire echo $NUM ((++NUM))done

Pour créer des boucles infinies, vous pouvez utiliser le mot clé "false" .

NUM $=0
$ jusqu'à ce que falsedo echo $NUM ((++NUM))done

Pour contrôler le flux de la boucle, vous pouvez utiliser le break et continue des mots-clés comme indiqué dans le while section de boucle ci-dessus.

Conclusion

Dans cet article, nous avons vu comment utiliser while boucle et until boucle dans les scripts bash. Until la boucle est la moins fréquemment utilisée par rapport à for et while boucles, mais c'est pour décider de votre script et des types de boucle requis. Soyez à l'aise dans l'utilisation des trois boucles.

Si vous avez des questions ou des commentaires, n'hésitez pas à nous le faire savoir via la section des commentaires ci-dessous.

Lire connexe :

  • Scripts bash – Fonctions expliquées à l'aide d'exemples
  • Scripts bash – Variables expliquées à l'aide d'exemples
  • La commande Bash Echo expliquée avec des exemples sous Linux
  • Tutoriel Bash Heredoc pour les débutants
  • Comment répéter une commande jusqu'à ce qu'elle réussisse sous Linux
  • Différence entre la définition de variables bash avec et sans exportation

Linux
  1. Bash For Loop Guide et exemples

  2. Commandes tête et queue sous Linux expliquées avec des exemples

  3. Exemples de boucle Bash For et de boucle While

  4. Vous tenir au courant - Exemples de boucle Bash For, While, Until

  5. Utiliser et dans la boucle while de Bash

Bash Scripting - Commande Printf expliquée avec des exemples

Bash Scripting - Tableau associatif expliqué avec des exemples

Bash Scripting - Tableau indexé expliqué avec des exemples

Bash For Loops avec des exemples

Bash Scripting Part2 - Boucles For et While avec exemples

Script bash pour la boucle expliqué avec des exemples