aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Alessi <alessi@robertalessi.net>2018-09-23 19:58:03 +0200
committerRobert Alessi <alessi@robertalessi.net>2018-09-23 19:58:03 +0200
commitbfb57e9cc5e9fb66c402687818890d042babbf58 (patch)
tree64d6727610b749cb2d7515eb19d5e980a82e6b90
parent1545bd6317ce42fb8417767f4aa0230d31ec0389 (diff)
downloadcourses-bfb57e9cc5e9fb66c402687818890d042babbf58.tar.gz
03-grep-bash.tex: loops (1.5/2)
-rw-r--r--_preamble.tex4
-rw-r--r--fichiers/01-ligne-de-commande.tex2
-rw-r--r--fichiers/03-grep-bash.tex104
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 @@
20\hypersetup{colorlinks,allcolors=blue,linktocpage} 20\hypersetup{colorlinks,allcolors=blue,linktocpage}
21\usepackage{hyperxmp} 21\usepackage{hyperxmp}
22\usepackage{uri} 22\usepackage{uri}
23
24\usepackage{cleveref}
25\crefname{table}{tableau}{tableaux}
26
23\usepackage[type={CC}, modifier={by-sa}, version ={3.0}]{doclicense} 27\usepackage[type={CC}, modifier={by-sa}, version ={3.0}]{doclicense}
24\author{Robert Alessi} 28\author{Robert Alessi}
25\lowertitleback{\footnotesize\textcopyright{} 2018 Robert Alessi 29\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:
120 décrites pré\-cé\-dem\-ment. Il suffit, comme on le voit ici, de 120 décrites pré\-cé\-dem\-ment. Il suffit, comme on le voit ici, de
121 séparer les commandes par un point-virgule \mintinline{text}{;}; 121 séparer les commandes par un point-virgule \mintinline{text}{;};
122\item les lignes de commande acceptent des caractères appelés 122\item les lignes de commande acceptent des caractères appelés
123 \emph{jokers} à l'aide desquels on peut déclencher des opérations 123 \emph{wildcards} à l'aide desquels on peut déclencher des opérations
124 complexes, portant sur un très grand nombre de fichiers. Par 124 complexes, portant sur un très grand nombre de fichiers. Par
125 exemple, le caractère \mintinline{text}{*} peut se substituer à 125 exemple, le caractère \mintinline{text}{*} peut se substituer à
126 n'importe quelle chaîne de caractères. Ainsi, pour reprendre ce qui 126 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 @@
4\title{grep et bash} 4\title{grep et bash}
5\publishers{\url{https://notabug.org/ralessi/courses/}} 5\publishers{\url{https://notabug.org/ralessi/courses/}}
6\usepackage{units} 6\usepackage{units}
7\usepackage{cleveref}
8\usepackage{booktabs} 7\usepackage{booktabs}
9\usepackage{xltabular} 8\usepackage{xltabular}
10\usepackage{dingbat} 9\usepackage{dingbat}
@@ -20,6 +19,7 @@
20 breaklines, 19 breaklines,
21 breaksymbolright=\small\carriagereturn} 20 breaksymbolright=\small\carriagereturn}
22\setmintedinline{bgcolor=Lavender} 21\setmintedinline{bgcolor=Lavender}
22\usepackage{capt-of}
23\usepackage{soul} 23\usepackage{soul}
24\makeindex[name=cmds, intoc, title={Liste des commandes et 24\makeindex[name=cmds, intoc, title={Liste des commandes et
25 instructions}] 25 instructions}]
@@ -544,8 +544,10 @@ echo "et l'archive $backupdir.zip a été créée."
544\end{minted} 544\end{minted}
545 545
546\paragraph{read} 546\paragraph{read}
547\index[cmds]{read|textbf} 547\label{ref:read}
548Cette nouvelle commande est expliquée dans le commentaire qui suit: 548\index[cmds]{read|textbf} Cette nouvelle commande est expliquée dans
549le commentaire qui suit\footnote{Voir aussi plus loin
550 \vpageref{ref:read-plus}.}:
549\begin{quoting} 551\begin{quoting}
550 \textbf{Commentaire:} 552 \textbf{Commentaire:}
551 \begin{enumerate} 553 \begin{enumerate}
@@ -803,6 +805,7 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}.
803 exécution \\ 805 exécution \\
804 \bottomrule 806 \bottomrule
805 \caption{tests\label{tab:tests}} 807 \caption{tests\label{tab:tests}}
808 \label{tab:tests}
806\end{xltabular} 809\end{xltabular}
807 810
808\paragraph{test} 811\paragraph{test}
@@ -988,9 +991,8 @@ d'instructions doit reprendre et continuer à s'exécuter aussi
988longtemps qu'une condition donnée n'est pas remplie. 991longtemps qu'une condition donnée n'est pas remplie.
989 992
990Prenons un exemple simple. Nous avons dans un répertoire plusieurs 993Prenons un exemple simple. Nous avons dans un répertoire plusieurs
991centaines d'images et que nous souhaitons convertir au format 994centaines d'images et nous souhaitons convertir au format \verb|.png|
992\verb|.png| toutes les images qui sont enregistrées au format 995toutes les images qui sont enregistrées au format \verb|.tiff|.
993\verb|.tiff|.
994 996
995Pour convertir une seule image, nous pouvons utiliser l'outil en ligne 997Pour convertir une seule image, nous pouvons utiliser l'outil en ligne
996de commande \verb|convert| fourni par le programme 998de commande \verb|convert| fourni par le programme
@@ -1079,7 +1081,97 @@ done
1079 \end{enumerate} 1081 \end{enumerate}
1080\end{quoting} 1082\end{quoting}
1081 1083
1084\paragraph{while}
1085\index[cmds]{while|textbf} L'expression \verb|while| exécute les
1086lignes de code qui suivent aussi longtemps qu'un test donné retourne
1087un résultat positif (\enquote{vrai}, en anglais \emph{true}). Le
1088script \verb|countlines.sh|, donné dans le \cref{lst:countlines}
1089ci-dessous, utilise cette expression pour compter les lignes des
1090fichiers.
1091\begin{minted}[linenos,highlightlines={13,16-17}]{bash}
1092#!/bin/bash
1093
1094echo "Entrez le nom du fichier dont vous voulez compter les lignes:"
1095read -p 'Fichier: ' file
1096
1097numline=0
1098
1099if [ ! -e $file ] || [ -z $file ]
1100 then
1101 echo "Erreur: le fichier $file n'existe pas."
1102 exit 1
1103 else
1104 while read line
1105 # 'let' permet de poser des opérations arithmétiques;
1106 # à la place, on aurait pu écrire: do ((++numline))
1107 do let "numline = numline + 1"
1108 done < $file
1109fi
1110
1111if [ $numline -le 1 ]
1112 then
1113 echo "Votre fichier $file compte $numline ligne."
1114 else
1115 echo "Votre fichier $file compte $numline lignes."
1116fi
1117\end{minted}
1118\captionof{listing}{bash: \texttt{while}\label{lst:countlines}}
1119
1120\paragraph{read}
1121\label{ref:read-plus}\index[cmds]{read|textbf}
1122On a déjà présenté plus haut \vpageref{ref:read} cette
1123instruction. Pour bien comprendre le \cref{lst:countlines}, il faut
1124savoir que la fonction de \verb|read| est de \emph{lire une ligne},
1125quelle que soit cette ligne, depuis l'entrée standard du \emph{shell}
1126(en anglais: \emph{standard input}). Dans le \vref{lst:case}, la ligne
1127en question était donc constituée d'une saisie au clavier dans
1128laquelle la ligne était formée par une chaîne de caractères terminée
1129par un \emph{retour charriot} (\emph{carriage return}).
1130
1131Étudions de près les lignes~13--17 du \cref{lst:countlines}:
1132l'instruction \verb|while| (l.~13) se termine à la ligne~17 par
1133\verb|done|. Et aussitôt à ce moment,
1134\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L749}{l'opérateur
1135 de redirection} \mintinline{bash}|<| lit le contenu du fichier dont
1136le nom correspond à la variable \verb|file| et le passe en argument à
1137la boucle \verb|while ... done|.
1138
1139\paragraph{Commentaire du \cref{lst:countlines}}
1140\begin{enumerate}
1141\item À la ligne~6, on crée une variable \verb|numline| à laquelle
1142 on attribue la valeur \verb|0|. Elle servira donc de compteur.
1143\item L'instruction essentielle est à la ligne~13:
1144 \mintinline{bash}|while read line|: comme ce qui suit \verb|while|
1145 \emph{est un test}, ce test donnera un résultat positif aussi
1146 longtemps que la variable \verb|line| existe, c'est-à-dire aussi
1147 longtemps que l'opérateur de redirection \mintinline{bash}|<| de la
1148 ligne~17 envoie des lignes terminées par un retour charriot. Tant
1149 que cette condition est remplie, la commande de la ligne~16 sera
1150 exécutée, et le compteur de lignes sera incrémenté d'une unité à
1151 chaque fois.
1152\item Les instructions des lignes~20--25 sont faciles à
1153 suivre. Étudiez-les à l'aide du \vref{tab:tests}: vous pourrez
1154 comprendre comment la programmation peut être adaptée pour suivre
1155 les règles de l'orthographe française.
1156\end{enumerate}
1157
1158Exécutons maintenant le script:
1159\begin{minted}{text}
1160[robert@kiddo courses]$ ./countlines.sh
1161Entrez le nom du fichier dont vous voulez compter les lignes:
1162Fichier: whack
1163Erreur: le fichier whack n'existe pas.
1164[robert@kiddo courses]$ ./countlines.sh
1165Entrez le nom du fichier dont vous voulez compter les lignes:
1166Fichier: makefile
1167Votre fichier makefile compte 17 lignes.
1168\end{minted}
1169
1170
1082\hfill\verb|../..| à suivre 1171\hfill\verb|../..| à suivre
1083 1172
1084\printindex[cmds] 1173\printindex[cmds]
1085\end{document} 1174\end{document}
1175
1176\item \verb|<| lit le contenu du fichier dont le nom suit et le passe
1177 en argument à la commande qui précède pour traitement. \ No newline at end of file