From 1545bd6317ce42fb8417767f4aa0230d31ec0389 Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Sun, 23 Sep 2018 14:54:55 +0200 Subject: added indices. 03-grep-bash.tex: loops (1/2) --- fichiers/01-ligne-de-commande.tex | 93 ++++++++------- fichiers/03-grep-bash.tex | 230 ++++++++++++++++++++++++++++---------- 2 files changed, 224 insertions(+), 99 deletions(-) (limited to 'fichiers') diff --git a/fichiers/01-ligne-de-commande.tex b/fichiers/01-ligne-de-commande.tex index 5509a4c..5b3b6e2 100644 --- a/fichiers/01-ligne-de-commande.tex +++ b/fichiers/01-ligne-de-commande.tex @@ -17,6 +17,9 @@ breaksymbolright=\small\carriagereturn} \setmintedinline{bgcolor=Lavender} \usepackage{soul} +\makeindex[name=cmds, intoc, title={Liste des commandes et + instructions}] + \begin{document} \maketitle \renewcommand{\contentsname}{Sommaire} @@ -55,10 +58,10 @@ Pour réaliser les mêmes opérations à la ligne de commande, il aurait fallu saisir les lignes suivantes: \begin{enumerate} \item création du dossier \emph{travail}:\\ - \mintinline{text}{mkdir travail} + \index[cmds]{mkdir}\mintinline{text}{mkdir travail} \item déplacement du fichier \emph{exemple.pdf} dans le dossier travail: \\ -\mintinline{text}{mv exemple.pdf travail} + \index[cmds]{mv}\mintinline{text}{mv exemple.pdf travail} \end{enumerate} \paragraph{Commentaire} @@ -233,7 +236,7 @@ pour le moment: \label{sec:prem-comm} \paragraph{pwd} -\label{sec:pwd} +\label{sec:pwd}\index[cmds]{pwd|textbf} Signifie \emph{print working directory}. Cette commande vous retourne tout simplement le chemin d'accès absolu du répertoire dans lequel vous vous trouvez. Très utile pour ne pas se perdre! Exemple: @@ -268,7 +271,7 @@ vous vous trouvez. Très utile pour ne pas se perdre! Exemple: \end{quoting} \paragraph{mv} -\label{sec:mv} +\label{sec:mv}\index[cmds]{mv|textbf} Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit vers un autre. La syntaxe est la suivante: \begin{minted}[showspaces]{text} @@ -298,10 +301,10 @@ Utilisation de raccourcis: \end{minted} \paragraph{cp} -\label{sec:cp} +\label{sec:cp}\index[cmds]{cp|textbf} Signifie \emph{copy}. Cette commande copie des fichiers depuis un endroit vers un autre. La syntaxe est comparable à celle de la -séquence \mintinline{text}{mv}. +séquence \index[cmds]{mv}\mintinline{text}{mv}. \begin{minted}[showspaces]{text} cp \end{minted} @@ -326,7 +329,7 @@ Utilisation de raccourcis: \end{minted} \paragraph{cd} -\label{sec:cd} +\label{sec:cd}\index[cmds]{cd|textbf} Signifie \emph{change directory}. Permet de changer de répertoire courant, par exemple pour travailler sur les fichiers d'un répertoire différent de son \emph{home directory}. La syntaxe est la suivante: @@ -343,7 +346,7 @@ Exemple: changement vers le répertoire \mintinline{text}|/usr/bin|: Remarquez le changement de l'invite après l'exécution de la commande. L'invite nous donne l'indication du nouveau répertoire. \end{quoting} -Confirmation par la commande \mintinline{text}{pwd}: +Confirmation par la commande \index[cmds]{pwd}\mintinline{text}{pwd}: \begin{minted}{text} [robert@kiddo /usr/bin]$ pwd /usr/bin @@ -355,7 +358,7 @@ Confirmation par la commande \mintinline{text}{pwd}: \end{quoting} \paragraph{ls} -\label{sec:ls} +\label{sec:ls}\index[cmds]{ls|(textbf} Signifie \emph{list}. Affiche à l'écran tous les fichiers et les répertoires contenus dans un répertoire donné. Si on ne précise pas le répertoire dont il faut lister les fichiers, la commande liste les @@ -488,6 +491,7 @@ valeurs que celles qui sont commentées ci-dessous sont possibles. dernière fois. \item Le nom du fichier. \end{enumerate} +\index[cmds]{ls|)} \chapter{Bash, le shell} \label{cha:bash-le-shell} @@ -517,7 +521,7 @@ que l'on saura que \verb+fichier.png+ est un fichier image. cas de l'extension mais regarde directement à l'intérieur de chaque fichier pour en déterminer le type. -\paragraph{file} +\paragraph{file}\index[cmds]{file|textbf} La commande \mintinline{text}|file| permet de tout savoir sur les types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt Git: @@ -607,9 +611,9 @@ possibles: Tout fichier dont le nom commence par un point (\mintinline{text}|.|) est considéré comme un fichier caché. Le plus souvent, les fichiers cachés contiennent des paramètres de configuration. La commande -\mintinline{text}|ls| est capable de les afficher si on lui passe -l'option \mintinline{text}|-a| pour \emph{all}. Appliquons cette -option sur notre dépôt Git: +\index[cmds]{ls}\mintinline{text}|ls| est capable de les afficher si +on lui passe l'option \mintinline{text}|-a| pour +\emph{all}. Appliquons cette option sur notre dépôt Git: \begin{minted}[escapeinside=||,linenos]{text} [robert@kiddo courses]$ ls -la total 72 @@ -635,7 +639,7 @@ ligne~7 un fichier caché. Ces commandes s'ajoutent à celles qui sont décrites plus haut (\vref{sec:prem-comm}). -\paragraph{mkdir} +\paragraph{mkdir}\index[cmds]{mkdir|textbf} Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p| peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour @@ -647,18 +651,19 @@ mkdir: création du répertoire 'sandbox' mkdir: création du répertoire 'sandbox/robert' \end{minted} -\paragraph{touch} +\paragraph{touch}\index[cmds]{touch|textbf} Sert à créer un fichier vide dont le nom est passé en argument. Cette commande sert également à modifier les métadonnées de temps associées aux fichiers (date de création et/ou de modification). L'exemple suivant montre comment créer un nouveau dossier dans lequel on crée également un fichier vide \verb|fichier.txt|. Ensuite, on -utilise la commande \verb|mv| pour \emph{déplacer} ce fichier vers un -autre fichier \verb|fichier-mk2.txt| au même endroit. Le résultat de -cette action particulière, le \emph{déplacement au même endroit}, est -tout simplement de renommer le fichier. Enfin, la commande % -\verb|ls -l| sert de moyen de contrôle: +utilise la commande \index[cmds]{mv}\verb|mv| pour \emph{déplacer} ce +fichier vers un autre fichier \verb|fichier-mk2.txt| au même +endroit. Le résultat de cette action particulière, le +\emph{déplacement au même endroit}, est tout simplement de renommer le +fichier. Enfin, la commande % +\index[cmds]{ls}\verb|ls -l| sert de moyen de contrôle: \begin{minted}{text} [robert@kiddo courses]$ mkdir -pv sandbox mkdir: création du répertoire 'sandbox' @@ -672,7 +677,7 @@ total 0 \subsection{Commandes destructives} \label{sec:comm-destr} -\paragraph{rm} +\paragraph{rm}\index[cmds]{rm|textbf} Pour \emph{remove}. Il suffit de passer en argument à cette commande ce que l'on souhaite détruire. Par défaut, cette commande ne détruit pas les répertoires. Elle accepte une série d'options dont voici les @@ -745,11 +750,12 @@ les commandes renvoient vers un fichier à l'aide des \emph{opérateurs en argument à la commande qui précède pour traitement. \end{enumerate} -Dans l'exemple qui suit, on demande à la commande \verb|ls -l| de -rediriger son résultat vers un fichier \verb|all-files.txt|. On -s'assure que ce fichier a bien été créé, puis on demande à la commande -\verb|cat| d'en afficher le contenu au terminal. Les trois commandes -sont entrées aux lignes 1, 2 et 4: +Dans l'exemple qui suit, on demande à la commande +\index[cmds]{ls}\verb|ls -l| de rediriger son résultat vers un fichier +\verb|all-files.txt|. On s'assure que ce fichier a bien été créé, puis +on demande à la commande \index[cmds]{cat}\verb|cat| d'en afficher le +contenu au terminal. Les trois commandes sont entrées aux lignes 1, 2 +et 4: \begin{minted}[escapeinside=||,linenos]{text} [robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}| [robert@kiddo courses]$ ls @@ -793,7 +799,7 @@ caractère \emph{pipe} (\verb+|+). Avant d'aller plus loin, étudions rapidement deux nouvelles commandes qui servent à filtrer le contenu des fichiers. -\paragraph{head}\label{ref:head-tail} +\paragraph{head}\label{ref:head-tail}\index[cmds]{head|textbf} \mintinline{text}|head - fichier| affiche au terminal les \verb|| premières lignes d'un fichier. Sans l'option \mintinline{text}|-|, les 10 premières lignes sont @@ -805,7 +811,7 @@ affichées. Exemple: ./_preamble.tex \end{minted} -\paragraph{tail} +\paragraph{tail}\index[cmds]{tail|textbf} \mintinline{text}|tail - fichier| affiche au terminal les \verb|| dernières lignes d'un fichier. Sans l'option \mintinline{text}|-|, les 10 dernières lignes sont affichées. @@ -823,13 +829,13 @@ dernière ligne, \emph{mais en commençant à partir de la ligne} Cet exemple reprend des commandes connues. Supposons que l'on veuille connaître simplement le nombre de fichiers du notre dépôt Git. Nous -savons produire une liste à l'aide de la commande \verb|ls -l|. Nous -savons également que la commande \verb|wc -l| compte les -lignes. Cependant, la première ligne retournée par la commande -\verb|ls -l|, qui donne la somme des \emph{file system blocks} occupés -par le contenu du répertoire, doit être exclue du compte (voir -\emph{supra}, \vpageref{ref:file-system-blocks}). C'est ici -qu'intervient la commande, \verb|tail|, qui retourne les dernières +savons produire une liste à l'aide de la commande +\index[cmds]{ls}\verb|ls -l|. Nous savons également que la commande +\verb|wc -l| compte les lignes. Cependant, la première ligne retournée +par la commande \verb|ls -l|, qui donne la somme des \emph{file system + blocks} occupés par le contenu du répertoire, doit être exclue du +compte (voir \emph{supra}, \vpageref{ref:file-system-blocks}). C'est +ici qu'intervient la commande, \verb|tail|, qui retourne les dernières lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne sera ignorée: \begin{minted}{text} @@ -846,13 +852,15 @@ leur contenu. Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}): \begin{enumerate} -\item \verb|head| qui sélectionne les premières lignes d'un fichier. -\item \verb|tail| qui sélectionne les dernières lignes d'un fichier. +\item \index[cmds]{head}\verb|head| qui sélectionne les premières + lignes d'un fichier. +\item \index[cmds]{tail}\verb|tail| qui sélectionne les dernières + lignes d'un fichier. \end{enumerate} On ajoutera ici les commandes suivantes: -\paragraph{cat} +\paragraph{cat}\index[cmds]{cat|textbf} Affiche au terminal tout le contenu d'un fichier: \begin{minted}{text} [robert@kiddo courses]$ cat ls-R @@ -863,7 +871,7 @@ Affiche au terminal tout le contenu d'un fichier: ./README.tex \end{minted} -\paragraph{wc}\label{ref:wc} +\paragraph{wc}\label{ref:wc}\index[cmds]{wc|textbf} Pour \emph{word count}. Cette commande a été utilisée plus haut une fois avec l'option \verb|-l| pour compter les lignes d'un fichier (\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le @@ -874,7 +882,7 @@ nombre de lignes (\verb|-l|), de mots (\verb|-w|) et de caractères 21 114 627 makefile \end{minted} -\paragraph{cut} +\paragraph{cut}\index[cmds]{cut|textbf} Permet de mettre en forme des données. Prenons l'exemple du fichier suivant: \\ \mintinline{text}|etudiants.txt| \begin{minted}{text} @@ -909,7 +917,7 @@ forme de façon à placer le prénom avant le nom et avoir les adresses email entre crochets pointus? Comment faire aussi pour récupérer les données dans un tableur? -\paragraph{awk} +\paragraph{awk}\index[cmds]{awk|textbf} Ce programme accessible à la ligne de commande permet d'effectuer ce travail facilement. Il sélectionne les données dans l'ordre que l'on souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|, @@ -946,10 +954,11 @@ Hector;Pédot; \end{enumerate} \end{quoting} Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt| -en \verb|etudiants.csv| par la commande: +en \verb|etudiants.csv| par la commande:\index[cmds]{mv} \begin{minted}{text} mv etudiants.txt etudiants.csv \end{minted} et de l'ouvrir dans LibreOffice Calc. +\printindex[cmds] \end{document} diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex index 3b685e3..65f01cf 100644 --- a/fichiers/03-grep-bash.tex +++ b/fichiers/03-grep-bash.tex @@ -21,6 +21,9 @@ breaksymbolright=\small\carriagereturn} \setmintedinline{bgcolor=Lavender} \usepackage{soul} +\makeindex[name=cmds, intoc, title={Liste des commandes et + instructions}] + \begin{document} \maketitle \renewcommand{\contentsname}{Sommaire} @@ -29,10 +32,10 @@ \listoftables \chapter{grep, les expressions régulières} -\label{cha:grep-les-expressions} +\label{cha:grep-les-expressions}\index[cmds]{grep} Les expressions régulières se rapprochent des \emph{wildcards} ou \enquote{métacaractères} qui ont été présentés dans -\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L709}{le +\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L714}{le cours sur la ligne de commande}. C'est une technique commune à pour ainsi dire tous les langages de programmation qui permet de construire des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de @@ -114,6 +117,7 @@ symboles suivants\footnote{Cette liste n'est pas exhaustive.}: \end{xltabular} \paragraph{grep, egrep} +\index[cmds]{grep|textbf}\index[cmds]{egrep|see{grep}} À la place de \verb|grep|, on peut saisir à la ligne de commande \verb|egrep| ou \verb|grep -E| pour \emph{extended regular expressions}. Quelle est la différence? Retenez ici simplement que @@ -144,7 +148,7 @@ d'options. Parmi ces options, retenons celles-ci: \end{description} \paragraph{Exemples} -Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la +Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L737}{la technique de la redirection}. \begin{minted}{text} [robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\' | grep 'ea' @@ -352,7 +356,7 @@ art dans le cadre de la programmation en \label{sec:execution} Il faut ici approfondir la notion de \emph{permissions} sur les fichiers qui a été présentée dans le cours sur la -\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L451}{ligne +\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L454}{ligne de commande}. Nous avons en effet étudié trois types de permissions sur les fichiers: en lecture, en écriture et en exécution. Revenons sur les permissions données par défaut au script \verb|backup.sh|: @@ -368,6 +372,7 @@ Soit: \end{itemize} \paragraph{chmod} +\index[cmds]{chmod|textbf} La commande qui permet de changer les droits s'appelle \verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que les permissions sont traduites par des valeurs numériques, à savoir: @@ -402,11 +407,11 @@ où \verb|xyz| sont les trois chiffres qui représentent les permissions. \begin{enumerate} \item La commande \verb|chmod| a été entrée à la ligne 1. \item À la ligne 2, nous avons lancé la commande - \mintinline{text}|ls -l --color| sur le fichier \verb|backup.sh|: - les droits listés à la ligne 3 montrent bien que la valeur - \verb|x| a été ajoutée aux trois endroits possibles. On voit enfin - que l'option \verb|--color| affiche en vert les fichiers qui sont - exécutables. + \index[cmds]{ls}\mintinline{text}|ls -l --color| sur le fichier + \verb|backup.sh|: les droits listés à la ligne 3 montrent bien que + la valeur \verb|x| a été ajoutée aux trois endroits possibles. On + voit enfin que l'option \verb|--color| affiche en vert les + fichiers qui sont exécutables. \end{enumerate} \end{quoting} @@ -448,8 +453,9 @@ _preamble_bbl.tex _preamble-ed.tex _preamble.tex README.tex \begin{quoting} \textbf{Commentaire:} \begin{itemize} - \item lignes 1--11: la commande \verb|ls -l --color| donne l'état du - dossier \emph{avant} l'exécution du script \verb|backup.sh|; + \item lignes 1--11: la commande \index[cmds]{ls}\verb|ls -l --color| + donne l'état du dossier \emph{avant} l'exécution du script + \verb|backup.sh|; \item lignes 12--17: exécution du script et messages du terminal; \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du dossier \emph{après} l'exécution du script \verb|backup.sh|. On @@ -481,9 +487,9 @@ caché. \label{sec:les-variables} Les variables sont des informations temporaires qui peuvent être stockées et rappelées à tout moment. L'exemple qui suit va donner -l'occasion d'étudier une nouvelle commande, \verb|echo|, dont le rôle -est justement de retourner au terminal la chaîne de caractères qu'on -lui passe en argument: +l'occasion d'étudier une nouvelle commande, +\index[cmds]{echo}\verb|echo|, dont le rôle est justement de retourner +au terminal la chaîne de caractères qu'on lui passe en argument: \begin{minted}[linenos]{text} [robert@kiddo courses]$ mysystem="Linux" [robert@kiddo courses]$ echo 'Mon système est $mysystem.' @@ -503,7 +509,7 @@ Mon système est Linux. \end{description} \begin{mdframed}[backgroundcolor=Cyan] Observez la différence dans l'usage des guillemets! - \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L554}{Comme + \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L558}{Comme on le sait}, les guillemets servent à indiquer au \emph{shell} que les espaces ne sont pas des caractères actifs. Il y a cependant une grande différence entre les guillemets simples et @@ -538,6 +544,7 @@ 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: \begin{quoting} \textbf{Commentaire:} @@ -598,9 +605,10 @@ précédées du signe $=$. Exemple: \begin{quoting} \textbf{Commentaire:} \begin{enumerate} - \item À la ligne~1, la commande \verb|ls| liste les fichiers, puis - son résultat est interprété par \verb|wc -l| qui compte le nombre - de fichiers retournés. + \item À la ligne~1, la commande \index[cmds]{ls}\verb|ls| liste les + fichiers, puis son résultat est interprété par + \index[cmds]{wc}\verb|wc -l| qui compte le nombre de fichiers + retournés. \item La variable \verb|$nbre| contient donc ce dernier résultat. \end{enumerate} \end{quoting} @@ -662,24 +670,24 @@ fi \begin{enumerate} \item Observez la structure de la condition: \begin{itemize} - \item ligne 1: \mintinline{bash}|if| $\rightarrow$ \emph{si - } où la condition est posée entre crochets. Dans - l'expression entre les crochets, % + \item ligne 1: \index[cmds]{if|textbf}\mintinline{bash}|if| + $\rightarrow$ \emph{si } où la condition est posée + entre crochets. Dans l'expression entre les crochets, % \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir| existe \emph{et} est un répertoire; - \item ligne 2: \mintinline{bash}|then| $\rightarrow$ \emph{alors, - passez à la ligne suivante}; - \item ligne 6: \mintinline{bash}|else| $\rightarrow$ - \emph{autrement, passez à la ligne suivante}; - \item ligne 8: \mintinline{bash}|fi| $\rightarrow$ \emph{fin de la - condition} (en fait les deux lettres de la conjonction \verb|if| - écrite à l'envers). + \item ligne 2: \index[cmds]{then|textbf}\mintinline{bash}|then| + $\rightarrow$ \emph{alors, passez à la ligne suivante}; + \item ligne 6: \index[cmds]{else|textbf}\mintinline{bash}|else| + $\rightarrow$ \emph{autrement, passez à la ligne suivante}; + \item ligne 8: \index[cmds]{fi|textbf}\mintinline{bash}|fi| + $\rightarrow$ \emph{fin de la condition} (en fait les deux + lettres de la conjonction \verb|if| écrite à l'envers). \end{itemize} - \item À la ligne 5, la commande \verb|exit 1| ordonne au programme - de se terminer immédiatement et de renvoyer la valeur \verb|1| - comme numéro d'état (\emph{status number}). Par convention, - \verb|0| est pour \emph{true} (le programme a bien été exécuté) et - \verb|1| est pour \emph{false} (il y a eu une erreur). + \item À la ligne 5, la commande \index[cmds]{exit}\verb|exit 1| + ordonne au programme de se terminer immédiatement et de renvoyer + la valeur \verb|1| comme numéro d'état (\emph{status number}). Par + convention, \verb|0| est pour \emph{true} (le programme a bien été + exécuté) et \verb|1| est pour \emph{false} (il y a eu une erreur). \end{enumerate} \end{quoting} @@ -716,10 +724,11 @@ echo "et l'archive $backupdir.zip a été créée." Supposons que le répertoire de sauvegarde ait été supprimé mais que l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons -utiliser dans le script l'instruction \verb|elif| qui permet de -construire des conditions en série. Littéralement, \verb|elif| est -pour \emph{else if}, \enquote{ou autrement, si\ldots}. Voici donc ce -qu'il faut ajouter: +utiliser dans le script l'instruction +\index[cmds]{elif|textbf}\verb|elif| qui permet de construire des +conditions en série. Littéralement, \verb|elif| est pour \emph{else + if}, \enquote{ou autrement, si\ldots}. Voici donc ce qu'il faut +ajouter: \begin{minted}{bash} elif [ -e "$backupdir".zip ] then @@ -797,13 +806,15 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}. \end{xltabular} \paragraph{test} -À l'intérieur du script \verb|bash|, les crochets renvoient en fait à -une commande par ailleurs disponible: \verb|test|. La commande -\verb|test| renvoie en fait la sortie \verb|0| si le résultat est -\emph{vrai} et \verb|1| si le résultat est \emph{faux}. Le terminal ne -retourne pas le resultat, mais celui-ci est associé à une variable +\index[cmds]{test|textbf} À l'intérieur du script \verb|bash|, les +crochets renvoient en fait à une commande par ailleurs disponible: +\verb|test|. La commande \verb|test| renvoie en fait la sortie +\verb|0| si le résultat est \emph{vrai} et \verb|1| si le résultat est +\emph{faux}. Le terminal ne retourne pas le resultat, mais celui-ci +est associé à une variable \verb|$?| que l'on peut afficher par la commande: -\mintinline{bash}|echo $?|. En voici quelques exemples: +\index[cmds]{echo}\mintinline{bash}|echo $?|. En voici quelques +exemples: \begin{minted}[linenos]{text} [robert@kiddo courses]$ ls bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex @@ -837,8 +848,9 @@ L'indentation est une technique qui consiste à donner aux lignes de code différentes profondeurs de marge à gauche de façon à distinguer clairement des blocs logiques. Les lignes 7--20 du \vref{lst:if-then-else} en donnent un exemple. L'indentation permet de -faire apparaître clairement ce qui dépend de l'instruction \verb|if| -(l.~7), puis \verb|elif| (l.~12) et enfin \verb|else| (l.~18). +faire apparaître clairement ce qui dépend de l'instruction +\index[cmds]{if}\verb|if| (l.~7), puis \index[cmds]{elif}\verb|elif| +(l.~12) et enfin \index[cmds]{else}\verb|else| (l.~18). Cette technique est commune à tous les langages informatiques et tous les programmeurs l'utilisent. En Python, que nous étudierons plus @@ -892,18 +904,18 @@ fi \end{minted} \subsection{case} -\label{sec:case} +\label{sec:case}\index[cmds]{case|textbf} \verb|case| est une instruction qui permet d'exécuter différentes actions en fonction de la valeur d'une variable. Elle est intéressante à étudier ici car elle fait appel à la fois à la notion de variable et aux expressions régulières. La syntaxe est la suivante: -\begin{minted}[linenos,escapeinside=||]{text} -case |\emph{variable}| in - |\emph{regexpr1}|) - |\emph{commandes ...}| +\begin{minted}[linenos]{bash} +case $var in + expr1) + ;; - |\emph{regexpr2}|) - |\emph{commandes ...}| + expr2) + ;; esac \end{minted} @@ -920,7 +932,9 @@ esac \end{enumerate} \end{quoting} -Voici un exemple facile à comprendre: +Le \vref{lst:case} montre un exemple facile à comprendre de cette +technique. +\begin{listing}[H] \begin{minted}[linenos]{bash} #!/bin/bash @@ -939,12 +953,15 @@ case $animal in ;; esac \end{minted} +\caption{bash: instruction \texttt{case}} +\label{lst:case} +\end{listing} \begin{quoting} \textbf{Commentaire:} \begin{enumerate} \item À la ligne 4, l'utilisateur est invité à entrer une - réponse. L'instruction \verb|read| associe la réponse à la - variable \verb|animal|. + réponse. L'instruction \index[cmds]{read}\verb|read| associe la + réponse à la variable \verb|animal|. \item À la ligne 6, l'instruction \verb|case| reprend la variable qui est donc préfixée par le signe \verb|$|. \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le @@ -960,10 +977,109 @@ esac \begin{quoting} \textbf{Remarque:} à la place de l'instruction \verb|case|, on recommande aujourd'hui d'utiliser une nouvelle instruction, - \verb|switch|, dont la syntaxe, plus complexe, n'est pas étudiée - ici. + \index[cmds]{switch}\verb|switch|, dont la syntaxe, plus complexe, + n'est pas étudiée ici. +\end{quoting} + +\section{Boucles} +\label{sec:boucles} +Les boucles (en anglais: \emph{loops}) servent à indiquer qu'une série +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|. + +Pour convertir une seule image, nous pouvons utiliser l'outil en ligne +de commande \verb|convert| fourni par le programme +\emph{imagemagick}\footnote{\url{http://www.imagemagick.org}}. Pour +convertir une seule image, la syntaxe est la suivante: +\begin{minted}{bash} +convert image.tiff image.png +\end{minted} + +Mais comment faire pour en convertir un grand nombre pris dans un +répertoire qui en compte des centaines enregistrées dans des formats +différents? + +\paragraph{basename} +\index[cmds]{basename|textbf}Avant de continuer, il faut dire un mot +de la commande \verb|basename| que nous allons utiliser ici. Cette +commande permet de dépouiller un nom de fichier de son chemin d'accès +et de son extension. La syntaxe est la suivante: +\begin{minted}[escapeinside=||]{text} +basename -s .|\emph{ext}| |\emph{file}| +\end{minted} +où \emph{ext} est le nom de l'extension et \emph{file} le nom du +fichier. Voici un exemple: +\begin{minted}{text} +[robert@kiddo fichiers]$ ls -l images/ +total 252 +-rw-r--r-- 1 robert robert 96404 2 juil. 18:32 02-ascii.png +-rw-r--r-- 1 robert robert 33951 20 juin 19:59 02-donnees1.png +-rw-r--r-- 1 robert robert 11503 20 juin 20:01 02-donnees2.png +-rw-r--r-- 1 robert robert 17450 3 juil. 17:43 02-exercice_formats.png +-rw-r--r-- 1 robert robert 87510 14 sept. 15:06 02-unicode.png +[robert@kiddo fichiers]$ basename -s .png images/* +02-ascii +02-donnees1 +02-donnees2 +02-exercice_formats +02-unicode +\end{minted} + +\paragraph{for-do-done} +\index[cmds]{for|textbf}\index[cmds]{do|textbf}\index[cmds]{done|textbf} +La boucle que nous allons utiliser fait appel à trois instructions: +\begin{enumerate} +\item \verb|for| prend comme argument un nom qui sera ensuite traité + comme une variable. Le nom de la variable est suivi de l'instruction + \verb|in| et d'un nom de fichier qui contient des données séparées + par des espaces ou bien d'une expression dans laquelle on a placé + des \emph{wildcards}. +\item \verb|do| est suivi des commandes qu'il faut exécuter sur chaque + élément retourné par l'instruction \verb|for| \ldots{} \verb|in|. +\item \verb|done| marque la fin de la boucle. +\end{enumerate} + +Voici maintenant le script qui assure la conversion du format +\verb|.tiff| vers le format \verb|.png|: +\begin{listing}[H] +\begin{minted}[linenos]{bash} +#!/bin/bash +for file in $(basename -s .tiff $(ls *.tiff)) + do convert "$file".tiff "$file".png +done +\end{minted} +\caption{bash: \texttt{for ... do ... done}} +\end{listing} + +\begin{quoting} + \textbf{Commentaire:} + \begin{enumerate} + \item Comprendre ainsi le début de la ligne~2 % + (\mintinline{bash}|for file in|): \enquote{pour tout \texttt{file} + dans\ldots} où \verb|file| définit une variable dont la valeur + pourra ensuite être rappelée par \verb|$file|. Le reste de la + ligne est une \emph{double capture} (v.~\emph{supra}, + \vref{sec:capt-et-subst}): + \begin{enumerate} + \item \verb|$(ls *.tiff)| liste et retourne tous les fichiers dont + l'extension est \verb|.tiff| + \item \verb|$(basename -s .tiff $(ls *.tiff))| demande à + \verb|basename| de dépouiller tous ces fichiers de leur + extension \verb|.tiff| et retourne la liste des noms seuls. + \end{enumerate} + \item La variable \verb|file| est donc une liste constituée des noms + de tous les fichiers \verb|.tiff| sans leur extension. La ligne~3 + les convertit tous les uns après les autres vers le format + \verb|.png|. + \end{enumerate} \end{quoting} \hfill\verb|../..| à suivre +\printindex[cmds] \end{document} -- cgit v1.2.3