aboutsummaryrefslogtreecommitdiff
path: root/fichiers/03-grep-bash.tex
diff options
context:
space:
mode:
Diffstat (limited to 'fichiers/03-grep-bash.tex')
-rw-r--r--fichiers/03-grep-bash.tex230
1 files changed, 173 insertions, 57 deletions
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 @@
21 breaksymbolright=\small\carriagereturn} 21 breaksymbolright=\small\carriagereturn}
22\setmintedinline{bgcolor=Lavender} 22\setmintedinline{bgcolor=Lavender}
23\usepackage{soul} 23\usepackage{soul}
24\makeindex[name=cmds, intoc, title={Liste des commandes et
25 instructions}]
26
24\begin{document} 27\begin{document}
25\maketitle 28\maketitle
26\renewcommand{\contentsname}{Sommaire} 29\renewcommand{\contentsname}{Sommaire}
@@ -29,10 +32,10 @@
29\listoftables 32\listoftables
30 33
31\chapter{grep, les expressions régulières} 34\chapter{grep, les expressions régulières}
32\label{cha:grep-les-expressions} 35\label{cha:grep-les-expressions}\index[cmds]{grep}
33Les expressions régulières se rapprochent des \emph{wildcards} ou 36Les expressions régulières se rapprochent des \emph{wildcards} ou
34\enquote{métacaractères} qui ont été présentés dans 37\enquote{métacaractères} qui ont été présentés dans
35\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L709}{le 38\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L714}{le
36 cours sur la ligne de commande}. C'est une technique commune à pour 39 cours sur la ligne de commande}. C'est une technique commune à pour
37ainsi dire tous les langages de programmation qui permet de construire 40ainsi dire tous les langages de programmation qui permet de construire
38des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de 41des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de
@@ -114,6 +117,7 @@ symboles suivants\footnote{Cette liste n'est pas exhaustive.}:
114\end{xltabular} 117\end{xltabular}
115 118
116\paragraph{grep, egrep} 119\paragraph{grep, egrep}
120\index[cmds]{grep|textbf}\index[cmds]{egrep|see{grep}}
117À la place de \verb|grep|, on peut saisir à la ligne de commande 121À la place de \verb|grep|, on peut saisir à la ligne de commande
118\verb|egrep| ou \verb|grep -E| pour \emph{extended regular 122\verb|egrep| ou \verb|grep -E| pour \emph{extended regular
119 expressions}. Quelle est la différence? Retenez ici simplement que 123 expressions}. Quelle est la différence? Retenez ici simplement que
@@ -144,7 +148,7 @@ d'options. Parmi ces options, retenons celles-ci:
144\end{description} 148\end{description}
145 149
146\paragraph{Exemples} 150\paragraph{Exemples}
147Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la 151Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L737}{la
148 technique de la redirection}. 152 technique de la redirection}.
149\begin{minted}{text} 153\begin{minted}{text}
150[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea' 154[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea'
@@ -352,7 +356,7 @@ art dans le cadre de la programmation en
352\label{sec:execution} 356\label{sec:execution}
353Il faut ici approfondir la notion de \emph{permissions} sur les 357Il faut ici approfondir la notion de \emph{permissions} sur les
354fichiers qui a été présentée dans le cours sur la 358fichiers qui a été présentée dans le cours sur la
355\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L451}{ligne 359\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L454}{ligne
356 de commande}. Nous avons en effet étudié trois types de permissions 360 de commande}. Nous avons en effet étudié trois types de permissions
357sur les fichiers: en lecture, en écriture et en exécution. Revenons 361sur les fichiers: en lecture, en écriture et en exécution. Revenons
358sur les permissions données par défaut au script \verb|backup.sh|: 362sur les permissions données par défaut au script \verb|backup.sh|:
@@ -368,6 +372,7 @@ Soit:
368\end{itemize} 372\end{itemize}
369 373
370\paragraph{chmod} 374\paragraph{chmod}
375\index[cmds]{chmod|textbf}
371La commande qui permet de changer les droits s'appelle 376La commande qui permet de changer les droits s'appelle
372\verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que 377\verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que
373les permissions sont traduites par des valeurs numériques, à savoir: 378les 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.
402 \begin{enumerate} 407 \begin{enumerate}
403 \item La commande \verb|chmod| a été entrée à la ligne 1. 408 \item La commande \verb|chmod| a été entrée à la ligne 1.
404 \item À la ligne 2, nous avons lancé la commande 409 \item À la ligne 2, nous avons lancé la commande
405 \mintinline{text}|ls -l --color| sur le fichier \verb|backup.sh|: 410 \index[cmds]{ls}\mintinline{text}|ls -l --color| sur le fichier
406 les droits listés à la ligne 3 montrent bien que la valeur 411 \verb|backup.sh|: les droits listés à la ligne 3 montrent bien que
407 \verb|x| a été ajoutée aux trois endroits possibles. On voit enfin 412 la valeur \verb|x| a été ajoutée aux trois endroits possibles. On
408 que l'option \verb|--color| affiche en vert les fichiers qui sont 413 voit enfin que l'option \verb|--color| affiche en vert les
409 exécutables. 414 fichiers qui sont exécutables.
410 \end{enumerate} 415 \end{enumerate}
411\end{quoting} 416\end{quoting}
412 417
@@ -448,8 +453,9 @@ _preamble_bbl.tex _preamble-ed.tex _preamble.tex README.tex
448\begin{quoting} 453\begin{quoting}
449 \textbf{Commentaire:} 454 \textbf{Commentaire:}
450 \begin{itemize} 455 \begin{itemize}
451 \item lignes 1--11: la commande \verb|ls -l --color| donne l'état du 456 \item lignes 1--11: la commande \index[cmds]{ls}\verb|ls -l --color|
452 dossier \emph{avant} l'exécution du script \verb|backup.sh|; 457 donne l'état du dossier \emph{avant} l'exécution du script
458 \verb|backup.sh|;
453 \item lignes 12--17: exécution du script et messages du terminal; 459 \item lignes 12--17: exécution du script et messages du terminal;
454 \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du 460 \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du
455 dossier \emph{après} l'exécution du script \verb|backup.sh|. On 461 dossier \emph{après} l'exécution du script \verb|backup.sh|. On
@@ -481,9 +487,9 @@ caché.
481\label{sec:les-variables} 487\label{sec:les-variables}
482Les variables sont des informations temporaires qui peuvent être 488Les variables sont des informations temporaires qui peuvent être
483stockées et rappelées à tout moment. L'exemple qui suit va donner 489stockées et rappelées à tout moment. L'exemple qui suit va donner
484l'occasion d'étudier une nouvelle commande, \verb|echo|, dont le rôle 490l'occasion d'étudier une nouvelle commande,
485est justement de retourner au terminal la chaîne de caractères qu'on 491\index[cmds]{echo}\verb|echo|, dont le rôle est justement de retourner
486lui passe en argument: 492au terminal la chaîne de caractères qu'on lui passe en argument:
487\begin{minted}[linenos]{text} 493\begin{minted}[linenos]{text}
488[robert@kiddo courses]$ mysystem="Linux" 494[robert@kiddo courses]$ mysystem="Linux"
489[robert@kiddo courses]$ echo 'Mon système est $mysystem.' 495[robert@kiddo courses]$ echo 'Mon système est $mysystem.'
@@ -503,7 +509,7 @@ Mon système est Linux.
503 \end{description} 509 \end{description}
504 \begin{mdframed}[backgroundcolor=Cyan] 510 \begin{mdframed}[backgroundcolor=Cyan]
505 Observez la différence dans l'usage des guillemets! 511 Observez la différence dans l'usage des guillemets!
506 \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L554}{Comme 512 \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L558}{Comme
507 on le sait}, les guillemets servent à indiquer au \emph{shell} 513 on le sait}, les guillemets servent à indiquer au \emph{shell}
508 que les espaces ne sont pas des caractères actifs. Il y a 514 que les espaces ne sont pas des caractères actifs. Il y a
509 cependant une grande différence entre les guillemets simples et 515 cependant une grande différence entre les guillemets simples et
@@ -538,6 +544,7 @@ echo "et l'archive $backupdir.zip a été créée."
538\end{minted} 544\end{minted}
539 545
540\paragraph{read} 546\paragraph{read}
547\index[cmds]{read|textbf}
541Cette nouvelle commande est expliquée dans le commentaire qui suit: 548Cette nouvelle commande est expliquée dans le commentaire qui suit:
542\begin{quoting} 549\begin{quoting}
543 \textbf{Commentaire:} 550 \textbf{Commentaire:}
@@ -598,9 +605,10 @@ précédées du signe $=$. Exemple:
598\begin{quoting} 605\begin{quoting}
599 \textbf{Commentaire:} 606 \textbf{Commentaire:}
600 \begin{enumerate} 607 \begin{enumerate}
601 \item À la ligne~1, la commande \verb|ls| liste les fichiers, puis 608 \item À la ligne~1, la commande \index[cmds]{ls}\verb|ls| liste les
602 son résultat est interprété par \verb|wc -l| qui compte le nombre 609 fichiers, puis son résultat est interprété par
603 de fichiers retournés. 610 \index[cmds]{wc}\verb|wc -l| qui compte le nombre de fichiers
611 retournés.
604 \item La variable \verb|$nbre| contient donc ce dernier résultat. 612 \item La variable \verb|$nbre| contient donc ce dernier résultat.
605 \end{enumerate} 613 \end{enumerate}
606\end{quoting} 614\end{quoting}
@@ -662,24 +670,24 @@ fi
662 \begin{enumerate} 670 \begin{enumerate}
663 \item Observez la structure de la condition: 671 \item Observez la structure de la condition:
664 \begin{itemize} 672 \begin{itemize}
665 \item ligne 1: \mintinline{bash}|if| $\rightarrow$ \emph{si 673 \item ligne 1: \index[cmds]{if|textbf}\mintinline{bash}|if|
666 <condition>} où la condition est posée entre crochets. Dans 674 $\rightarrow$ \emph{si <condition>} où la condition est posée
667 l'expression entre les crochets, % 675 entre crochets. Dans l'expression entre les crochets, %
668 \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir| 676 \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir|
669 existe \emph{et} est un répertoire; 677 existe \emph{et} est un répertoire;
670 \item ligne 2: \mintinline{bash}|then| $\rightarrow$ \emph{alors, 678 \item ligne 2: \index[cmds]{then|textbf}\mintinline{bash}|then|
671 passez à la ligne suivante}; 679 $\rightarrow$ \emph{alors, passez à la ligne suivante};
672 \item ligne 6: \mintinline{bash}|else| $\rightarrow$ 680 \item ligne 6: \index[cmds]{else|textbf}\mintinline{bash}|else|
673 \emph{autrement, passez à la ligne suivante}; 681 $\rightarrow$ \emph{autrement, passez à la ligne suivante};
674 \item ligne 8: \mintinline{bash}|fi| $\rightarrow$ \emph{fin de la 682 \item ligne 8: \index[cmds]{fi|textbf}\mintinline{bash}|fi|
675 condition} (en fait les deux lettres de la conjonction \verb|if| 683 $\rightarrow$ \emph{fin de la condition} (en fait les deux
676 écrite à l'envers). 684 lettres de la conjonction \verb|if| écrite à l'envers).
677 \end{itemize} 685 \end{itemize}
678 \item À la ligne 5, la commande \verb|exit 1| ordonne au programme 686 \item À la ligne 5, la commande \index[cmds]{exit}\verb|exit 1|
679 de se terminer immédiatement et de renvoyer la valeur \verb|1| 687 ordonne au programme de se terminer immédiatement et de renvoyer
680 comme numéro d'état (\emph{status number}). Par convention, 688 la valeur \verb|1| comme numéro d'état (\emph{status number}). Par
681 \verb|0| est pour \emph{true} (le programme a bien été exécuté) et 689 convention, \verb|0| est pour \emph{true} (le programme a bien été
682 \verb|1| est pour \emph{false} (il y a eu une erreur). 690 exécuté) et \verb|1| est pour \emph{false} (il y a eu une erreur).
683 \end{enumerate} 691 \end{enumerate}
684\end{quoting} 692\end{quoting}
685 693
@@ -716,10 +724,11 @@ echo "et l'archive $backupdir.zip a été créée."
716Supposons que le répertoire de sauvegarde ait été supprimé mais que 724Supposons que le répertoire de sauvegarde ait été supprimé mais que
717l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le 725l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le
718script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons 726script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons
719utiliser dans le script l'instruction \verb|elif| qui permet de 727utiliser dans le script l'instruction
720construire des conditions en série. Littéralement, \verb|elif| est 728\index[cmds]{elif|textbf}\verb|elif| qui permet de construire des
721pour \emph{else if}, \enquote{ou autrement, si\ldots}. Voici donc ce 729conditions en série. Littéralement, \verb|elif| est pour \emph{else
722qu'il faut ajouter: 730 if}, \enquote{ou autrement, si\ldots}. Voici donc ce qu'il faut
731ajouter:
723\begin{minted}{bash} 732\begin{minted}{bash}
724elif [ -e "$backupdir".zip ] 733elif [ -e "$backupdir".zip ]
725 then 734 then
@@ -797,13 +806,15 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}.
797\end{xltabular} 806\end{xltabular}
798 807
799\paragraph{test} 808\paragraph{test}
800À l'intérieur du script \verb|bash|, les crochets renvoient en fait à 809\index[cmds]{test|textbf} À l'intérieur du script \verb|bash|, les
801une commande par ailleurs disponible: \verb|test|. La commande 810crochets renvoient en fait à une commande par ailleurs disponible:
802\verb|test| renvoie en fait la sortie \verb|0| si le résultat est 811\verb|test|. La commande \verb|test| renvoie en fait la sortie
803\emph{vrai} et \verb|1| si le résultat est \emph{faux}. Le terminal ne 812\verb|0| si le résultat est \emph{vrai} et \verb|1| si le résultat est
804retourne pas le resultat, mais celui-ci est associé à une variable 813\emph{faux}. Le terminal ne retourne pas le resultat, mais celui-ci
814est associé à une variable
805\verb|$?| que l'on peut afficher par la commande: 815\verb|$?| que l'on peut afficher par la commande:
806\mintinline{bash}|echo $?|. En voici quelques exemples: 816\index[cmds]{echo}\mintinline{bash}|echo $?|. En voici quelques
817exemples:
807\begin{minted}[linenos]{text} 818\begin{minted}[linenos]{text}
808[robert@kiddo courses]$ ls 819[robert@kiddo courses]$ ls
809bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex 820bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex
@@ -837,8 +848,9 @@ L'indentation est une technique qui consiste à donner aux lignes de
837code différentes profondeurs de marge à gauche de façon à distinguer 848code différentes profondeurs de marge à gauche de façon à distinguer
838clairement des blocs logiques. Les lignes 7--20 du 849clairement des blocs logiques. Les lignes 7--20 du
839\vref{lst:if-then-else} en donnent un exemple. L'indentation permet de 850\vref{lst:if-then-else} en donnent un exemple. L'indentation permet de
840faire apparaître clairement ce qui dépend de l'instruction \verb|if| 851faire apparaître clairement ce qui dépend de l'instruction
841(l.~7), puis \verb|elif| (l.~12) et enfin \verb|else| (l.~18). 852\index[cmds]{if}\verb|if| (l.~7), puis \index[cmds]{elif}\verb|elif|
853(l.~12) et enfin \index[cmds]{else}\verb|else| (l.~18).
842 854
843Cette technique est commune à tous les langages informatiques et tous 855Cette technique est commune à tous les langages informatiques et tous
844les programmeurs l'utilisent. En Python, que nous étudierons plus 856les programmeurs l'utilisent. En Python, que nous étudierons plus
@@ -892,18 +904,18 @@ fi
892\end{minted} 904\end{minted}
893 905
894\subsection{case} 906\subsection{case}
895\label{sec:case} 907\label{sec:case}\index[cmds]{case|textbf}
896\verb|case| est une instruction qui permet d'exécuter différentes 908\verb|case| est une instruction qui permet d'exécuter différentes
897actions en fonction de la valeur d'une variable. Elle est intéressante 909actions en fonction de la valeur d'une variable. Elle est intéressante
898à étudier ici car elle fait appel à la fois à la notion de variable et 910à étudier ici car elle fait appel à la fois à la notion de variable et
899aux expressions régulières. La syntaxe est la suivante: 911aux expressions régulières. La syntaxe est la suivante:
900\begin{minted}[linenos,escapeinside=||]{text} 912\begin{minted}[linenos]{bash}
901case |\emph{variable}| in 913case $var in
902 |\emph{regexpr1}|) 914 expr1)
903 |\emph{commandes ...}| 915 <commandes ...>
904 ;; 916 ;;
905 |\emph{regexpr2}|) 917 expr2)
906 |\emph{commandes ...}| 918 <commandes ...>
907 ;; 919 ;;
908esac 920esac
909\end{minted} 921\end{minted}
@@ -920,7 +932,9 @@ esac
920 \end{enumerate} 932 \end{enumerate}
921\end{quoting} 933\end{quoting}
922 934
923Voici un exemple facile à comprendre: 935Le \vref{lst:case} montre un exemple facile à comprendre de cette
936technique.
937\begin{listing}[H]
924\begin{minted}[linenos]{bash} 938\begin{minted}[linenos]{bash}
925#!/bin/bash 939#!/bin/bash
926 940
@@ -939,12 +953,15 @@ case $animal in
939 ;; 953 ;;
940esac 954esac
941\end{minted} 955\end{minted}
956\caption{bash: instruction \texttt{case}}
957\label{lst:case}
958\end{listing}
942\begin{quoting} 959\begin{quoting}
943 \textbf{Commentaire:} 960 \textbf{Commentaire:}
944 \begin{enumerate} 961 \begin{enumerate}
945 \item À la ligne 4, l'utilisateur est invité à entrer une 962 \item À la ligne 4, l'utilisateur est invité à entrer une
946 réponse. L'instruction \verb|read| associe la réponse à la 963 réponse. L'instruction \index[cmds]{read}\verb|read| associe la
947 variable \verb|animal|. 964 réponse à la variable \verb|animal|.
948 \item À la ligne 6, l'instruction \verb|case| reprend la variable 965 \item À la ligne 6, l'instruction \verb|case| reprend la variable
949 qui est donc préfixée par le signe \verb|$|. 966 qui est donc préfixée par le signe \verb|$|.
950 \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le 967 \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le
@@ -960,10 +977,109 @@ esac
960\begin{quoting} 977\begin{quoting}
961 \textbf{Remarque:} à la place de l'instruction \verb|case|, on 978 \textbf{Remarque:} à la place de l'instruction \verb|case|, on
962 recommande aujourd'hui d'utiliser une nouvelle instruction, 979 recommande aujourd'hui d'utiliser une nouvelle instruction,
963 \verb|switch|, dont la syntaxe, plus complexe, n'est pas étudiée 980 \index[cmds]{switch}\verb|switch|, dont la syntaxe, plus complexe,
964 ici. 981 n'est pas étudiée ici.
982\end{quoting}
983
984\section{Boucles}
985\label{sec:boucles}
986Les boucles (en anglais: \emph{loops}) servent à indiquer qu'une série
987d'instructions doit reprendre et continuer à s'exécuter aussi
988longtemps qu'une condition donnée n'est pas remplie.
989
990Prenons un exemple simple. Nous avons dans un répertoire plusieurs
991centaines d'images et que nous souhaitons convertir au format
992\verb|.png| toutes les images qui sont enregistrées au format
993\verb|.tiff|.
994
995Pour convertir une seule image, nous pouvons utiliser l'outil en ligne
996de commande \verb|convert| fourni par le programme
997\emph{imagemagick}\footnote{\url{http://www.imagemagick.org}}. Pour
998convertir une seule image, la syntaxe est la suivante:
999\begin{minted}{bash}
1000convert image.tiff image.png
1001\end{minted}
1002
1003Mais comment faire pour en convertir un grand nombre pris dans un
1004répertoire qui en compte des centaines enregistrées dans des formats
1005différents?
1006
1007\paragraph{basename}
1008\index[cmds]{basename|textbf}Avant de continuer, il faut dire un mot
1009de la commande \verb|basename| que nous allons utiliser ici. Cette
1010commande permet de dépouiller un nom de fichier de son chemin d'accès
1011et de son extension. La syntaxe est la suivante:
1012\begin{minted}[escapeinside=||]{text}
1013basename -s .|\emph{ext}| |\emph{file}|
1014\end{minted}
1015où \emph{ext} est le nom de l'extension et \emph{file} le nom du
1016fichier. Voici un exemple:
1017\begin{minted}{text}
1018[robert@kiddo fichiers]$ ls -l images/
1019total 252
1020-rw-r--r-- 1 robert robert 96404 2 juil. 18:32 02-ascii.png
1021-rw-r--r-- 1 robert robert 33951 20 juin 19:59 02-donnees1.png
1022-rw-r--r-- 1 robert robert 11503 20 juin 20:01 02-donnees2.png
1023-rw-r--r-- 1 robert robert 17450 3 juil. 17:43 02-exercice_formats.png
1024-rw-r--r-- 1 robert robert 87510 14 sept. 15:06 02-unicode.png
1025[robert@kiddo fichiers]$ basename -s .png images/*
102602-ascii
102702-donnees1
102802-donnees2
102902-exercice_formats
103002-unicode
1031\end{minted}
1032
1033\paragraph{for-do-done}
1034\index[cmds]{for|textbf}\index[cmds]{do|textbf}\index[cmds]{done|textbf}
1035La boucle que nous allons utiliser fait appel à trois instructions:
1036\begin{enumerate}
1037\item \verb|for| prend comme argument un nom qui sera ensuite traité
1038 comme une variable. Le nom de la variable est suivi de l'instruction
1039 \verb|in| et d'un nom de fichier qui contient des données séparées
1040 par des espaces ou bien d'une expression dans laquelle on a placé
1041 des \emph{wildcards}.
1042\item \verb|do| est suivi des commandes qu'il faut exécuter sur chaque
1043 élément retourné par l'instruction \verb|for| \ldots{} \verb|in|.
1044\item \verb|done| marque la fin de la boucle.
1045\end{enumerate}
1046
1047Voici maintenant le script qui assure la conversion du format
1048\verb|.tiff| vers le format \verb|.png|:
1049\begin{listing}[H]
1050\begin{minted}[linenos]{bash}
1051#!/bin/bash
1052for file in $(basename -s .tiff $(ls *.tiff))
1053 do convert "$file".tiff "$file".png
1054done
1055\end{minted}
1056\caption{bash: \texttt{for ... do ... done}}
1057\end{listing}
1058
1059\begin{quoting}
1060 \textbf{Commentaire:}
1061 \begin{enumerate}
1062 \item Comprendre ainsi le début de la ligne~2 %
1063 (\mintinline{bash}|for file in|): \enquote{pour tout \texttt{file}
1064 dans\ldots} où \verb|file| définit une variable dont la valeur
1065 pourra ensuite être rappelée par \verb|$file|. Le reste de la
1066 ligne est une \emph{double capture} (v.~\emph{supra},
1067 \vref{sec:capt-et-subst}):
1068 \begin{enumerate}
1069 \item \verb|$(ls *.tiff)| liste et retourne tous les fichiers dont
1070 l'extension est \verb|.tiff|
1071 \item \verb|$(basename -s .tiff $(ls *.tiff))| demande à
1072 \verb|basename| de dépouiller tous ces fichiers de leur
1073 extension \verb|.tiff| et retourne la liste des noms seuls.
1074 \end{enumerate}
1075 \item La variable \verb|file| est donc une liste constituée des noms
1076 de tous les fichiers \verb|.tiff| sans leur extension. La ligne~3
1077 les convertit tous les uns après les autres vers le format
1078 \verb|.png|.
1079 \end{enumerate}
965\end{quoting} 1080\end{quoting}
966 1081
967\hfill\verb|../..| à suivre 1082\hfill\verb|../..| à suivre
968 1083
1084\printindex[cmds]
969\end{document} 1085\end{document}