From bfb57e9cc5e9fb66c402687818890d042babbf58 Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Sun, 23 Sep 2018 19:58:03 +0200 Subject: 03-grep-bash.tex: loops (1.5/2) --- _preamble.tex | 4 ++ fichiers/01-ligne-de-commande.tex | 2 +- fichiers/03-grep-bash.tex | 104 +++++++++++++++++++++++++++++++++++--- 3 files changed, 103 insertions(+), 7 deletions(-) diff --git a/_preamble.tex b/_preamble.tex index 8f02fd7..d71b26d 100644 --- a/_preamble.tex +++ b/_preamble.tex @@ -20,6 +20,10 @@ \hypersetup{colorlinks,allcolors=blue,linktocpage} \usepackage{hyperxmp} \usepackage{uri} + +\usepackage{cleveref} +\crefname{table}{tableau}{tableaux} + \usepackage[type={CC}, modifier={by-sa}, version ={3.0}]{doclicense} \author{Robert Alessi} \lowertitleback{\footnotesize\textcopyright{} 2018 Robert Alessi diff --git a/fichiers/01-ligne-de-commande.tex b/fichiers/01-ligne-de-commande.tex index 5b3b6e2..b4d438f 100644 --- a/fichiers/01-ligne-de-commande.tex +++ b/fichiers/01-ligne-de-commande.tex @@ -120,7 +120,7 @@ fait à l'aide de la souris. En voici les principales raisons: décrites pré\-cé\-dem\-ment. Il suffit, comme on le voit ici, de séparer les commandes par un point-virgule \mintinline{text}{;}; \item les lignes de commande acceptent des caractères appelés - \emph{jokers} à l'aide desquels on peut déclencher des opérations + \emph{wildcards} à l'aide desquels on peut déclencher des opérations complexes, portant sur un très grand nombre de fichiers. Par exemple, le caractère \mintinline{text}{*} peut se substituer à n'importe quelle chaîne de caractères. Ainsi, pour reprendre ce qui 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