Initiation au shell boucle (for, do, done)

punition de mon fils - initiation à la ligne de commandeLa punition de mon fils.

J'avais prévenu, certains articles sentiront le réchauffé, celui date d'au moins environ 8 ans.

"Ton lit n'est pas encore fait!?... J'en ai assez! Tu vas me copier cent fois Je fais mon lit chaque matin."

C'est ça l'autorité du père!

Une feuille m'arrive sous le nez, avec une seule ligne à l'encre noire:

for i in $(seq 100); do echo $i" Je fais mon lit chaque matin."; done;

Que dire?... La majuscule en début de phrase est respectée, le point final aussi et en plus, les lignes seront numérotées de 1 à 100.

Alors pour ne pas en rester là, je lui dis qu'une ligne de commande, c'est bien, mais un script aurait été mieux. Il faut bien avoir le dernier mot quand on est le père.

Introduction au script

Le signe "#" signifie que la ligne ou ce qui suit le "#" est un commentaire et donc ignoré par le Shell. Exception "#!" en effet "#!" (sans espace) signifie un préfixe au nom de l'exécutable qui va effectivement traiter les lignes qui le suivent. On l'appelle "shebang" et doit être la première ligne du script.

#!/bin/bash
# boucle basique avec for, do done
for i in $(seq 100)
do
echo $i" Je fais mon lit chaque matin."
done
echo "TERMINE"

Explications :
seq: affiche le nombre séquences allant de 1 au maximum indiqué.
for: cherche des éléments restants dans une liste ou ici dans une séquence de 1 à 100 (c'est-à-dire reste-t-il des chiffres à lire avant d'atteindre le maximum?), et attend donc une réponse à ce test.
Le code de retour est égal à 0 quand il est vrai (true) il est égal à 1 quand il est faux (false).
S'il renvoie "true" il met le nombre actuel dans la liste à la variable ("i" dans notre exemple) et exécute la partie entre do et done (écrit le chiffre "i" en cours et "Je fais mon lit chaque matin."). Il vérifie de nouveau jusqu'au renvoie "false" qui signifie que les séquences sont terminées.
A "false", "for" arrête de boucler et passe à la ligne suivant "done", l'instruction (echo "TERMINE").
"echo" permet d'écrire à l'écran.

Vous allez me dire "Oui, mais la phrase peut être différente en fonction de la faute et le nombre de lignes peut varier en fonction de la gravité de la faute".

Vous avez raison, il y a deux variables qu'il faut saisir, alors on peut rajouter:

#!/bin/bash
# boucle basique avec for, do done
echo -n "Entrez votre phrase de punition : "
read phrase
echo -n "Entrez le Nb de lignes : "
read lignes
for i in $(seq $lignes)
do
echo $i" $phrase"
done
echo "TERMINE"echo

Une fois le script enregistré (par exemple sous le nom : punition.sh), il suffit de le rendre exécutable puis le lancer, ce qui donne:

$ chmod +x punition.sh
$ ./punition.sh
Entrez votre phrase de punition : Je fais mon lit chaque matin.
Entrez le Nb de lignes : 5
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
Je fais mon lit chaque matin.
TERMINE

Vous pouvez aussi avec "$RANDOM" choisir un nombre aléatoire de lignes.

$ echo $RANDOM

Cela renvoie un nombre aléatoire entre 0 et 32767, oui, mais avec un peu de chance, on peut donc tomber sur 0 ligne, c'est inacceptable comme punition.
Nous allons donc rajouter un "+1".
«Oui, mais 32767 semble exagéré!»
Alors prenons le nombre de lignes maximum "150", ce n'est pas trop sévère...
Et voici notre ligne:

$ echo $((RANDOM%150+1))

A vous de l’intégrer dans votre script.

Articles à lire sur des sujets Similaires

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Ajouter un rétrolien

URL de rétrolien : https://chispa.fr/sima78/index.php?trackback/6

Haut de page