From bfb57e9cc5e9fb66c402687818890d042babbf58 Mon Sep 17 00:00:00 2001
From: Robert Alessi <alessi@robertalessi.net>
Date: Sun, 23 Sep 2018 19:58:03 +0200
Subject: 03-grep-bash.tex: loops (1.5/2)

---
 fichiers/03-grep-bash.tex | 104 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 98 insertions(+), 6 deletions(-)

(limited to 'fichiers/03-grep-bash.tex')

diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex
index 65f01cf..aaf007f 100644
--- a/fichiers/03-grep-bash.tex
+++ b/fichiers/03-grep-bash.tex
@@ -4,7 +4,6 @@
 \title{grep et bash}
 \publishers{\url{https://notabug.org/ralessi/courses/}}
 \usepackage{units}
-\usepackage{cleveref}
 \usepackage{booktabs}
 \usepackage{xltabular}
 \usepackage{dingbat}
@@ -20,6 +19,7 @@
   breaklines,
   breaksymbolright=\small\carriagereturn}
 \setmintedinline{bgcolor=Lavender}
+\usepackage{capt-of}
 \usepackage{soul}
 \makeindex[name=cmds, intoc, title={Liste des commandes et
   instructions}]
@@ -544,8 +544,10 @@ echo "et l'archive $backupdir.zip a été créée."
 \end{minted}
 
 \paragraph{read}
-\index[cmds]{read|textbf}
-Cette nouvelle commande est expliquée dans le commentaire qui suit:
+\label{ref:read}
+\index[cmds]{read|textbf} Cette nouvelle commande est expliquée dans
+le commentaire qui suit\footnote{Voir aussi plus loin
+  \vpageref{ref:read-plus}.}:
 \begin{quoting}
   \textbf{Commentaire:}
   \begin{enumerate}
@@ -803,6 +805,7 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}.
                       exécution \\
   \bottomrule
   \caption{tests\label{tab:tests}}
+  \label{tab:tests}
 \end{xltabular}
 
 \paragraph{test}
@@ -988,9 +991,8 @@ d'instructions doit reprendre et continuer à s'exécuter aussi
 longtemps qu'une condition donnée n'est pas remplie.
 
 Prenons un exemple simple. Nous avons dans un répertoire plusieurs
-centaines d'images et que nous souhaitons convertir au format
-\verb|.png| toutes les images qui sont enregistrées au format
-\verb|.tiff|.
+centaines d'images et nous souhaitons convertir au format \verb|.png|
+toutes les images qui sont enregistrées au format \verb|.tiff|.
 
 Pour convertir une seule image, nous pouvons utiliser l'outil en ligne
 de commande \verb|convert| fourni par le programme
@@ -1079,7 +1081,97 @@ done
   \end{enumerate}
 \end{quoting}
 
+\paragraph{while}
+\index[cmds]{while|textbf} L'expression \verb|while| exécute les
+lignes de code qui suivent aussi longtemps qu'un test donné retourne
+un résultat positif (\enquote{vrai}, en anglais \emph{true}). Le
+script \verb|countlines.sh|, donné dans le \cref{lst:countlines}
+ci-dessous, utilise cette expression pour compter les lignes des
+fichiers.
+\begin{minted}[linenos,highlightlines={13,16-17}]{bash}
+#!/bin/bash
+
+echo "Entrez le nom du fichier dont vous voulez compter les lignes:"
+read -p 'Fichier: ' file
+
+numline=0
+
+if [ ! -e $file ] || [ -z $file ]
+  then
+    echo "Erreur: le fichier $file n'existe pas."
+    exit 1
+  else
+    while read line
+      # 'let' permet de poser des opérations arithmétiques;
+      # à la place, on aurait pu écrire: do ((++numline))
+      do let "numline = numline + 1"
+    done < $file
+fi
+
+if [ $numline -le 1  ]
+  then
+    echo "Votre fichier $file compte $numline ligne."
+  else
+    echo "Votre fichier $file compte $numline lignes."
+fi
+\end{minted}
+\captionof{listing}{bash: \texttt{while}\label{lst:countlines}}
+
+\paragraph{read}
+\label{ref:read-plus}\index[cmds]{read|textbf}
+On a déjà présenté plus haut \vpageref{ref:read} cette
+instruction. Pour bien comprendre le \cref{lst:countlines}, il faut
+savoir que la fonction de \verb|read| est de \emph{lire une ligne},
+quelle que soit cette ligne, depuis l'entrée standard du \emph{shell}
+(en anglais: \emph{standard input}). Dans le \vref{lst:case}, la ligne
+en question était donc constituée d'une saisie au clavier dans
+laquelle la ligne était formée par une chaîne de caractères terminée
+par un \emph{retour charriot} (\emph{carriage return}).
+
+Étudions de près les lignes~13--17 du \cref{lst:countlines}:
+l'instruction \verb|while| (l.~13) se termine à la ligne~17 par
+\verb|done|. Et aussitôt à ce moment,
+\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L749}{l'opérateur
+  de redirection} \mintinline{bash}|<| lit le contenu du fichier dont
+le nom correspond à la variable \verb|file| et le passe en argument à
+la boucle \verb|while ... done|.
+
+\paragraph{Commentaire du \cref{lst:countlines}}
+\begin{enumerate}
+\item À la ligne~6, on crée une variable \verb|numline| à laquelle
+  on attribue la valeur \verb|0|. Elle servira donc de compteur.
+\item L'instruction essentielle est à la ligne~13:
+  \mintinline{bash}|while read line|: comme ce qui suit \verb|while|
+  \emph{est un test}, ce test donnera un résultat positif aussi
+  longtemps que la variable \verb|line| existe, c'est-à-dire aussi
+  longtemps que l'opérateur de redirection \mintinline{bash}|<| de la
+  ligne~17 envoie des lignes terminées par un retour charriot. Tant
+  que cette condition est remplie, la commande de la ligne~16 sera
+  exécutée, et le compteur de lignes sera incrémenté d'une unité à
+  chaque fois.
+\item Les instructions des lignes~20--25 sont faciles à
+  suivre. Étudiez-les à l'aide du \vref{tab:tests}: vous pourrez
+  comprendre comment la programmation peut être adaptée pour suivre
+  les règles de l'orthographe française.
+\end{enumerate}
+
+Exécutons maintenant le script:
+\begin{minted}{text}
+[robert@kiddo courses]$ ./countlines.sh 
+Entrez le nom du fichier dont vous voulez compter les lignes:
+Fichier: whack
+Erreur: le fichier whack n'existe pas.
+[robert@kiddo courses]$ ./countlines.sh 
+Entrez le nom du fichier dont vous voulez compter les lignes:
+Fichier: makefile
+Votre fichier makefile compte 17 lignes.
+\end{minted}
+
+
 \hfill\verb|../..| à suivre
 
 \printindex[cmds]
 \end{document}
+
+\item \verb|<| lit le contenu du fichier dont le nom suit et le passe
+  en argument à la commande qui précède pour traitement.
\ No newline at end of file
-- 
cgit v1.2.3

