diff options
author | Robert Alessi <alessi@robertalessi.net> | 2018-09-23 14:54:55 +0200 |
---|---|---|
committer | Robert Alessi <alessi@robertalessi.net> | 2018-09-23 14:54:55 +0200 |
commit | 1545bd6317ce42fb8417767f4aa0230d31ec0389 (patch) | |
tree | 960183c2c1d2e7c2c25c844f838f9466fa95badb | |
parent | b073ee4af2b029ae7d3167c13352199c7ccb9628 (diff) | |
download | courses-1545bd6317ce42fb8417767f4aa0230d31ec0389.tar.gz |
added indices. 03-grep-bash.tex: loops (1/2)
-rw-r--r-- | _preamble.tex | 2 | ||||
-rw-r--r-- | fichiers/01-ligne-de-commande.tex | 93 | ||||
-rw-r--r-- | fichiers/03-grep-bash.tex | 230 |
3 files changed, 226 insertions, 99 deletions
diff --git a/_preamble.tex b/_preamble.tex index 1cada26..8f02fd7 100644 --- a/_preamble.tex +++ b/_preamble.tex | |||
@@ -14,6 +14,8 @@ | |||
14 | \graphicspath{{images/}} | 14 | \graphicspath{{images/}} |
15 | 15 | ||
16 | \usepackage[french]{varioref} | 16 | \usepackage[french]{varioref} |
17 | \usepackage{imakeidx} | ||
18 | |||
17 | \usepackage[unicode=true]{hyperref} | 19 | \usepackage[unicode=true]{hyperref} |
18 | \hypersetup{colorlinks,allcolors=blue,linktocpage} | 20 | \hypersetup{colorlinks,allcolors=blue,linktocpage} |
19 | \usepackage{hyperxmp} | 21 | \usepackage{hyperxmp} |
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 @@ | |||
17 | breaksymbolright=\small\carriagereturn} | 17 | breaksymbolright=\small\carriagereturn} |
18 | \setmintedinline{bgcolor=Lavender} | 18 | \setmintedinline{bgcolor=Lavender} |
19 | \usepackage{soul} | 19 | \usepackage{soul} |
20 | \makeindex[name=cmds, intoc, title={Liste des commandes et | ||
21 | instructions}] | ||
22 | |||
20 | \begin{document} | 23 | \begin{document} |
21 | \maketitle | 24 | \maketitle |
22 | \renewcommand{\contentsname}{Sommaire} | 25 | \renewcommand{\contentsname}{Sommaire} |
@@ -55,10 +58,10 @@ Pour réaliser les mêmes opérations à la ligne de commande, il aurait | |||
55 | fallu saisir les lignes suivantes: | 58 | fallu saisir les lignes suivantes: |
56 | \begin{enumerate} | 59 | \begin{enumerate} |
57 | \item création du dossier \emph{travail}:\\ | 60 | \item création du dossier \emph{travail}:\\ |
58 | \mintinline{text}{mkdir travail} | 61 | \index[cmds]{mkdir}\mintinline{text}{mkdir travail} |
59 | \item déplacement du fichier \emph{exemple.pdf} dans le dossier | 62 | \item déplacement du fichier \emph{exemple.pdf} dans le dossier |
60 | travail: \\ | 63 | travail: \\ |
61 | \mintinline{text}{mv exemple.pdf travail} | 64 | \index[cmds]{mv}\mintinline{text}{mv exemple.pdf travail} |
62 | \end{enumerate} | 65 | \end{enumerate} |
63 | 66 | ||
64 | \paragraph{Commentaire} | 67 | \paragraph{Commentaire} |
@@ -233,7 +236,7 @@ pour le moment: | |||
233 | \label{sec:prem-comm} | 236 | \label{sec:prem-comm} |
234 | 237 | ||
235 | \paragraph{pwd} | 238 | \paragraph{pwd} |
236 | \label{sec:pwd} | 239 | \label{sec:pwd}\index[cmds]{pwd|textbf} |
237 | Signifie \emph{print working directory}. Cette commande vous retourne | 240 | Signifie \emph{print working directory}. Cette commande vous retourne |
238 | tout simplement le chemin d'accès absolu du répertoire dans lequel | 241 | tout simplement le chemin d'accès absolu du répertoire dans lequel |
239 | vous vous trouvez. Très utile pour ne pas se perdre! Exemple: | 242 | 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: | |||
268 | \end{quoting} | 271 | \end{quoting} |
269 | 272 | ||
270 | \paragraph{mv} | 273 | \paragraph{mv} |
271 | \label{sec:mv} | 274 | \label{sec:mv}\index[cmds]{mv|textbf} |
272 | Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit | 275 | Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit |
273 | vers un autre. La syntaxe est la suivante: | 276 | vers un autre. La syntaxe est la suivante: |
274 | \begin{minted}[showspaces]{text} | 277 | \begin{minted}[showspaces]{text} |
@@ -298,10 +301,10 @@ Utilisation de raccourcis: | |||
298 | \end{minted} | 301 | \end{minted} |
299 | 302 | ||
300 | \paragraph{cp} | 303 | \paragraph{cp} |
301 | \label{sec:cp} | 304 | \label{sec:cp}\index[cmds]{cp|textbf} |
302 | Signifie \emph{copy}. Cette commande copie des fichiers depuis un | 305 | Signifie \emph{copy}. Cette commande copie des fichiers depuis un |
303 | endroit vers un autre. La syntaxe est comparable à celle de la | 306 | endroit vers un autre. La syntaxe est comparable à celle de la |
304 | séquence \mintinline{text}{mv}. | 307 | séquence \index[cmds]{mv}\mintinline{text}{mv}. |
305 | \begin{minted}[showspaces]{text} | 308 | \begin{minted}[showspaces]{text} |
306 | cp <source> <destination> | 309 | cp <source> <destination> |
307 | \end{minted} | 310 | \end{minted} |
@@ -326,7 +329,7 @@ Utilisation de raccourcis: | |||
326 | \end{minted} | 329 | \end{minted} |
327 | 330 | ||
328 | \paragraph{cd} | 331 | \paragraph{cd} |
329 | \label{sec:cd} | 332 | \label{sec:cd}\index[cmds]{cd|textbf} |
330 | Signifie \emph{change directory}. Permet de changer de répertoire | 333 | Signifie \emph{change directory}. Permet de changer de répertoire |
331 | courant, par exemple pour travailler sur les fichiers d'un répertoire | 334 | courant, par exemple pour travailler sur les fichiers d'un répertoire |
332 | différent de son \emph{home directory}. La syntaxe est la suivante: | 335 | 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|: | |||
343 | Remarquez le changement de l'invite après l'exécution de la | 346 | Remarquez le changement de l'invite après l'exécution de la |
344 | commande. L'invite nous donne l'indication du nouveau répertoire. | 347 | commande. L'invite nous donne l'indication du nouveau répertoire. |
345 | \end{quoting} | 348 | \end{quoting} |
346 | Confirmation par la commande \mintinline{text}{pwd}: | 349 | Confirmation par la commande \index[cmds]{pwd}\mintinline{text}{pwd}: |
347 | \begin{minted}{text} | 350 | \begin{minted}{text} |
348 | [robert@kiddo /usr/bin]$ pwd | 351 | [robert@kiddo /usr/bin]$ pwd |
349 | /usr/bin | 352 | /usr/bin |
@@ -355,7 +358,7 @@ Confirmation par la commande \mintinline{text}{pwd}: | |||
355 | \end{quoting} | 358 | \end{quoting} |
356 | 359 | ||
357 | \paragraph{ls} | 360 | \paragraph{ls} |
358 | \label{sec:ls} | 361 | \label{sec:ls}\index[cmds]{ls|(textbf} |
359 | Signifie \emph{list}. Affiche à l'écran tous les fichiers et les | 362 | Signifie \emph{list}. Affiche à l'écran tous les fichiers et les |
360 | répertoires contenus dans un répertoire donné. Si on ne précise pas le | 363 | répertoires contenus dans un répertoire donné. Si on ne précise pas le |
361 | répertoire dont il faut lister les fichiers, la commande liste les | 364 | 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. | |||
488 | dernière fois. | 491 | dernière fois. |
489 | \item Le nom du fichier. | 492 | \item Le nom du fichier. |
490 | \end{enumerate} | 493 | \end{enumerate} |
494 | \index[cmds]{ls|)} | ||
491 | 495 | ||
492 | \chapter{Bash, le shell} | 496 | \chapter{Bash, le shell} |
493 | \label{cha:bash-le-shell} | 497 | \label{cha:bash-le-shell} |
@@ -517,7 +521,7 @@ que l'on saura que \verb+fichier.png+ est un fichier image. | |||
517 | cas de l'extension mais regarde directement à l'intérieur de chaque | 521 | cas de l'extension mais regarde directement à l'intérieur de chaque |
518 | fichier pour en déterminer le type. | 522 | fichier pour en déterminer le type. |
519 | 523 | ||
520 | \paragraph{file} | 524 | \paragraph{file}\index[cmds]{file|textbf} |
521 | La commande \mintinline{text}|file| permet de tout savoir sur les | 525 | La commande \mintinline{text}|file| permet de tout savoir sur les |
522 | types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt | 526 | types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt |
523 | Git: | 527 | Git: |
@@ -607,9 +611,9 @@ possibles: | |||
607 | Tout fichier dont le nom commence par un point (\mintinline{text}|.|) | 611 | Tout fichier dont le nom commence par un point (\mintinline{text}|.|) |
608 | est considéré comme un fichier caché. Le plus souvent, les fichiers | 612 | est considéré comme un fichier caché. Le plus souvent, les fichiers |
609 | cachés contiennent des paramètres de configuration. La commande | 613 | cachés contiennent des paramètres de configuration. La commande |
610 | \mintinline{text}|ls| est capable de les afficher si on lui passe | 614 | \index[cmds]{ls}\mintinline{text}|ls| est capable de les afficher si |
611 | l'option \mintinline{text}|-a| pour \emph{all}. Appliquons cette | 615 | on lui passe l'option \mintinline{text}|-a| pour |
612 | option sur notre dépôt Git: | 616 | \emph{all}. Appliquons cette option sur notre dépôt Git: |
613 | \begin{minted}[escapeinside=||,linenos]{text} | 617 | \begin{minted}[escapeinside=||,linenos]{text} |
614 | [robert@kiddo courses]$ ls -la | 618 | [robert@kiddo courses]$ ls -la |
615 | total 72 | 619 | total 72 |
@@ -635,7 +639,7 @@ ligne~7 un fichier caché. | |||
635 | Ces commandes s'ajoutent à celles qui sont décrites plus haut | 639 | Ces commandes s'ajoutent à celles qui sont décrites plus haut |
636 | (\vref{sec:prem-comm}). | 640 | (\vref{sec:prem-comm}). |
637 | 641 | ||
638 | \paragraph{mkdir} | 642 | \paragraph{mkdir}\index[cmds]{mkdir|textbf} |
639 | Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p| | 643 | Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p| |
640 | peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou | 644 | peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou |
641 | plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour | 645 | plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour |
@@ -647,18 +651,19 @@ mkdir: création du répertoire 'sandbox' | |||
647 | mkdir: création du répertoire 'sandbox/robert' | 651 | mkdir: création du répertoire 'sandbox/robert' |
648 | \end{minted} | 652 | \end{minted} |
649 | 653 | ||
650 | \paragraph{touch} | 654 | \paragraph{touch}\index[cmds]{touch|textbf} |
651 | Sert à créer un fichier vide dont le nom est passé en argument. Cette | 655 | Sert à créer un fichier vide dont le nom est passé en argument. Cette |
652 | commande sert également à modifier les métadonnées de temps associées | 656 | commande sert également à modifier les métadonnées de temps associées |
653 | aux fichiers (date de création et/ou de modification). | 657 | aux fichiers (date de création et/ou de modification). |
654 | 658 | ||
655 | L'exemple suivant montre comment créer un nouveau dossier dans lequel | 659 | L'exemple suivant montre comment créer un nouveau dossier dans lequel |
656 | on crée également un fichier vide \verb|fichier.txt|. Ensuite, on | 660 | on crée également un fichier vide \verb|fichier.txt|. Ensuite, on |
657 | utilise la commande \verb|mv| pour \emph{déplacer} ce fichier vers un | 661 | utilise la commande \index[cmds]{mv}\verb|mv| pour \emph{déplacer} ce |
658 | autre fichier \verb|fichier-mk2.txt| au même endroit. Le résultat de | 662 | fichier vers un autre fichier \verb|fichier-mk2.txt| au même |
659 | cette action particulière, le \emph{déplacement au même endroit}, est | 663 | endroit. Le résultat de cette action particulière, le |
660 | tout simplement de renommer le fichier. Enfin, la commande % | 664 | \emph{déplacement au même endroit}, est tout simplement de renommer le |
661 | \verb|ls -l| sert de moyen de contrôle: | 665 | fichier. Enfin, la commande % |
666 | \index[cmds]{ls}\verb|ls -l| sert de moyen de contrôle: | ||
662 | \begin{minted}{text} | 667 | \begin{minted}{text} |
663 | [robert@kiddo courses]$ mkdir -pv sandbox | 668 | [robert@kiddo courses]$ mkdir -pv sandbox |
664 | mkdir: création du répertoire 'sandbox' | 669 | mkdir: création du répertoire 'sandbox' |
@@ -672,7 +677,7 @@ total 0 | |||
672 | \subsection{Commandes destructives} | 677 | \subsection{Commandes destructives} |
673 | \label{sec:comm-destr} | 678 | \label{sec:comm-destr} |
674 | 679 | ||
675 | \paragraph{rm} | 680 | \paragraph{rm}\index[cmds]{rm|textbf} |
676 | Pour \emph{remove}. Il suffit de passer en argument à cette commande | 681 | Pour \emph{remove}. Il suffit de passer en argument à cette commande |
677 | ce que l'on souhaite détruire. Par défaut, cette commande ne détruit | 682 | ce que l'on souhaite détruire. Par défaut, cette commande ne détruit |
678 | pas les répertoires. Elle accepte une série d'options dont voici les | 683 | 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 | |||
745 | en argument à la commande qui précède pour traitement. | 750 | en argument à la commande qui précède pour traitement. |
746 | \end{enumerate} | 751 | \end{enumerate} |
747 | 752 | ||
748 | Dans l'exemple qui suit, on demande à la commande \verb|ls -l| de | 753 | Dans l'exemple qui suit, on demande à la commande |
749 | rediriger son résultat vers un fichier \verb|all-files.txt|. On | 754 | \index[cmds]{ls}\verb|ls -l| de rediriger son résultat vers un fichier |
750 | s'assure que ce fichier a bien été créé, puis on demande à la commande | 755 | \verb|all-files.txt|. On s'assure que ce fichier a bien été créé, puis |
751 | \verb|cat| d'en afficher le contenu au terminal. Les trois commandes | 756 | on demande à la commande \index[cmds]{cat}\verb|cat| d'en afficher le |
752 | sont entrées aux lignes 1, 2 et 4: | 757 | contenu au terminal. Les trois commandes sont entrées aux lignes 1, 2 |
758 | et 4: | ||
753 | \begin{minted}[escapeinside=||,linenos]{text} | 759 | \begin{minted}[escapeinside=||,linenos]{text} |
754 | [robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}| | 760 | [robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}| |
755 | [robert@kiddo courses]$ ls | 761 | [robert@kiddo courses]$ ls |
@@ -793,7 +799,7 @@ caractère \emph{pipe} (\verb+|+). | |||
793 | Avant d'aller plus loin, étudions rapidement deux nouvelles commandes | 799 | Avant d'aller plus loin, étudions rapidement deux nouvelles commandes |
794 | qui servent à filtrer le contenu des fichiers. | 800 | qui servent à filtrer le contenu des fichiers. |
795 | 801 | ||
796 | \paragraph{head}\label{ref:head-tail} | 802 | \paragraph{head}\label{ref:head-tail}\index[cmds]{head|textbf} |
797 | \mintinline{text}|head -<num> fichier| affiche au terminal les | 803 | \mintinline{text}|head -<num> fichier| affiche au terminal les |
798 | \verb|<num>| premières lignes d'un fichier. Sans l'option | 804 | \verb|<num>| premières lignes d'un fichier. Sans l'option |
799 | \mintinline{text}|-<num>|, les 10 premières lignes sont | 805 | \mintinline{text}|-<num>|, les 10 premières lignes sont |
@@ -805,7 +811,7 @@ affichées. Exemple: | |||
805 | ./_preamble.tex | 811 | ./_preamble.tex |
806 | \end{minted} | 812 | \end{minted} |
807 | 813 | ||
808 | \paragraph{tail} | 814 | \paragraph{tail}\index[cmds]{tail|textbf} |
809 | \mintinline{text}|tail -<num> fichier| affiche au terminal les | 815 | \mintinline{text}|tail -<num> fichier| affiche au terminal les |
810 | \verb|<num>| dernières lignes d'un fichier. Sans l'option | 816 | \verb|<num>| dernières lignes d'un fichier. Sans l'option |
811 | \mintinline{text}|-<num>|, les 10 dernières lignes sont affichées. | 817 | \mintinline{text}|-<num>|, les 10 dernières lignes sont affichées. |
@@ -823,13 +829,13 @@ dernière ligne, \emph{mais en commençant à partir de la ligne} | |||
823 | 829 | ||
824 | Cet exemple reprend des commandes connues. Supposons que l'on veuille | 830 | Cet exemple reprend des commandes connues. Supposons que l'on veuille |
825 | connaître simplement le nombre de fichiers du notre dépôt Git. Nous | 831 | connaître simplement le nombre de fichiers du notre dépôt Git. Nous |
826 | savons produire une liste à l'aide de la commande \verb|ls -l|. Nous | 832 | savons produire une liste à l'aide de la commande |
827 | savons également que la commande \verb|wc -l| compte les | 833 | \index[cmds]{ls}\verb|ls -l|. Nous savons également que la commande |
828 | lignes. Cependant, la première ligne retournée par la commande | 834 | \verb|wc -l| compte les lignes. Cependant, la première ligne retournée |
829 | \verb|ls -l|, qui donne la somme des \emph{file system blocks} occupés | 835 | par la commande \verb|ls -l|, qui donne la somme des \emph{file system |
830 | par le contenu du répertoire, doit être exclue du compte (voir | 836 | blocks} occupés par le contenu du répertoire, doit être exclue du |
831 | \emph{supra}, \vpageref{ref:file-system-blocks}). C'est ici | 837 | compte (voir \emph{supra}, \vpageref{ref:file-system-blocks}). C'est |
832 | qu'intervient la commande, \verb|tail|, qui retourne les dernières | 838 | ici qu'intervient la commande, \verb|tail|, qui retourne les dernières |
833 | lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne | 839 | lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne |
834 | sera ignorée: | 840 | sera ignorée: |
835 | \begin{minted}{text} | 841 | \begin{minted}{text} |
@@ -846,13 +852,15 @@ leur contenu. | |||
846 | 852 | ||
847 | Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}): | 853 | Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}): |
848 | \begin{enumerate} | 854 | \begin{enumerate} |
849 | \item \verb|head| qui sélectionne les premières lignes d'un fichier. | 855 | \item \index[cmds]{head}\verb|head| qui sélectionne les premières |
850 | \item \verb|tail| qui sélectionne les dernières lignes d'un fichier. | 856 | lignes d'un fichier. |
857 | \item \index[cmds]{tail}\verb|tail| qui sélectionne les dernières | ||
858 | lignes d'un fichier. | ||
851 | \end{enumerate} | 859 | \end{enumerate} |
852 | 860 | ||
853 | On ajoutera ici les commandes suivantes: | 861 | On ajoutera ici les commandes suivantes: |
854 | 862 | ||
855 | \paragraph{cat} | 863 | \paragraph{cat}\index[cmds]{cat|textbf} |
856 | Affiche au terminal tout le contenu d'un fichier: | 864 | Affiche au terminal tout le contenu d'un fichier: |
857 | \begin{minted}{text} | 865 | \begin{minted}{text} |
858 | [robert@kiddo courses]$ cat ls-R | 866 | [robert@kiddo courses]$ cat ls-R |
@@ -863,7 +871,7 @@ Affiche au terminal tout le contenu d'un fichier: | |||
863 | ./README.tex | 871 | ./README.tex |
864 | \end{minted} | 872 | \end{minted} |
865 | 873 | ||
866 | \paragraph{wc}\label{ref:wc} | 874 | \paragraph{wc}\label{ref:wc}\index[cmds]{wc|textbf} |
867 | Pour \emph{word count}. Cette commande a été utilisée plus haut une | 875 | Pour \emph{word count}. Cette commande a été utilisée plus haut une |
868 | fois avec l'option \verb|-l| pour compter les lignes d'un fichier | 876 | fois avec l'option \verb|-l| pour compter les lignes d'un fichier |
869 | (\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le | 877 | (\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 | |||
874 | 21 114 627 makefile | 882 | 21 114 627 makefile |
875 | \end{minted} | 883 | \end{minted} |
876 | 884 | ||
877 | \paragraph{cut} | 885 | \paragraph{cut}\index[cmds]{cut|textbf} |
878 | Permet de mettre en forme des données. Prenons l'exemple du fichier | 886 | Permet de mettre en forme des données. Prenons l'exemple du fichier |
879 | suivant: \\ \mintinline{text}|etudiants.txt| | 887 | suivant: \\ \mintinline{text}|etudiants.txt| |
880 | \begin{minted}{text} | 888 | \begin{minted}{text} |
@@ -909,7 +917,7 @@ forme de façon à placer le prénom avant le nom et avoir les adresses | |||
909 | email entre crochets pointus? Comment faire aussi pour récupérer les | 917 | email entre crochets pointus? Comment faire aussi pour récupérer les |
910 | données dans un tableur? | 918 | données dans un tableur? |
911 | 919 | ||
912 | \paragraph{awk} | 920 | \paragraph{awk}\index[cmds]{awk|textbf} |
913 | Ce programme accessible à la ligne de commande permet d'effectuer ce | 921 | Ce programme accessible à la ligne de commande permet d'effectuer ce |
914 | travail facilement. Il sélectionne les données dans l'ordre que l'on | 922 | travail facilement. Il sélectionne les données dans l'ordre que l'on |
915 | souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|, | 923 | souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|, |
@@ -946,10 +954,11 @@ Hector;Pédot;<hector.pedot@ailleurs.org> | |||
946 | \end{enumerate} | 954 | \end{enumerate} |
947 | \end{quoting} | 955 | \end{quoting} |
948 | Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt| | 956 | Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt| |
949 | en \verb|etudiants.csv| par la commande: | 957 | en \verb|etudiants.csv| par la commande:\index[cmds]{mv} |
950 | \begin{minted}{text} | 958 | \begin{minted}{text} |
951 | mv etudiants.txt etudiants.csv | 959 | mv etudiants.txt etudiants.csv |
952 | \end{minted} | 960 | \end{minted} |
953 | et de l'ouvrir dans LibreOffice Calc. | 961 | et de l'ouvrir dans LibreOffice Calc. |
954 | 962 | ||
963 | \printindex[cmds] | ||
955 | \end{document} | 964 | \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 @@ | |||
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} |
33 | Les expressions régulières se rapprochent des \emph{wildcards} ou | 36 | Les 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 |
37 | ainsi dire tous les langages de programmation qui permet de construire | 40 | ainsi dire tous les langages de programmation qui permet de construire |
38 | des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de | 41 | des \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} |
147 | Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la | 151 | Les 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} |
353 | Il faut ici approfondir la notion de \emph{permissions} sur les | 357 | Il faut ici approfondir la notion de \emph{permissions} sur les |
354 | fichiers qui a été présentée dans le cours sur la | 358 | fichiers 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 |
357 | sur les fichiers: en lecture, en écriture et en exécution. Revenons | 361 | sur les fichiers: en lecture, en écriture et en exécution. Revenons |
358 | sur les permissions données par défaut au script \verb|backup.sh|: | 362 | sur 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} | ||
371 | La commande qui permet de changer les droits s'appelle | 376 | La 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 |
373 | les permissions sont traduites par des valeurs numériques, à savoir: | 378 | 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. | |||
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} |
482 | Les variables sont des informations temporaires qui peuvent être | 488 | Les variables sont des informations temporaires qui peuvent être |
483 | stockées et rappelées à tout moment. L'exemple qui suit va donner | 489 | stockées et rappelées à tout moment. L'exemple qui suit va donner |
484 | l'occasion d'étudier une nouvelle commande, \verb|echo|, dont le rôle | 490 | l'occasion d'étudier une nouvelle commande, |
485 | est 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 |
486 | lui passe en argument: | 492 | au 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} | ||
541 | Cette nouvelle commande est expliquée dans le commentaire qui suit: | 548 | Cette 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." | |||
716 | Supposons que le répertoire de sauvegarde ait été supprimé mais que | 724 | Supposons que le répertoire de sauvegarde ait été supprimé mais que |
717 | l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le | 725 | l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le |
718 | script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons | 726 | script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons |
719 | utiliser dans le script l'instruction \verb|elif| qui permet de | 727 | utiliser dans le script l'instruction |
720 | construire des conditions en série. Littéralement, \verb|elif| est | 728 | \index[cmds]{elif|textbf}\verb|elif| qui permet de construire des |
721 | pour \emph{else if}, \enquote{ou autrement, si\ldots}. Voici donc ce | 729 | conditions en série. Littéralement, \verb|elif| est pour \emph{else |
722 | qu'il faut ajouter: | 730 | if}, \enquote{ou autrement, si\ldots}. Voici donc ce qu'il faut |
731 | ajouter: | ||
723 | \begin{minted}{bash} | 732 | \begin{minted}{bash} |
724 | elif [ -e "$backupdir".zip ] | 733 | elif [ -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 |
801 | une commande par ailleurs disponible: \verb|test|. La commande | 810 | crochets 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 |
804 | retourne pas le resultat, mais celui-ci est associé à une variable | 813 | \emph{faux}. Le terminal ne retourne pas le resultat, mais celui-ci |
814 | est 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 |
817 | exemples: | ||
807 | \begin{minted}[linenos]{text} | 818 | \begin{minted}[linenos]{text} |
808 | [robert@kiddo courses]$ ls | 819 | [robert@kiddo courses]$ ls |
809 | bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex | 820 | 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 | |||
837 | code différentes profondeurs de marge à gauche de façon à distinguer | 848 | code différentes profondeurs de marge à gauche de façon à distinguer |
838 | clairement des blocs logiques. Les lignes 7--20 du | 849 | clairement 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 |
840 | faire apparaître clairement ce qui dépend de l'instruction \verb|if| | 851 | faire 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 | ||
843 | Cette technique est commune à tous les langages informatiques et tous | 855 | Cette technique est commune à tous les langages informatiques et tous |
844 | les programmeurs l'utilisent. En Python, que nous étudierons plus | 856 | les 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 |
897 | actions en fonction de la valeur d'une variable. Elle est intéressante | 909 | actions 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 |
899 | aux expressions régulières. La syntaxe est la suivante: | 911 | aux expressions régulières. La syntaxe est la suivante: |
900 | \begin{minted}[linenos,escapeinside=||]{text} | 912 | \begin{minted}[linenos]{bash} |
901 | case |\emph{variable}| in | 913 | case $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 | ;; |
908 | esac | 920 | esac |
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 | ||
923 | Voici un exemple facile à comprendre: | 935 | Le \vref{lst:case} montre un exemple facile à comprendre de cette |
936 | technique. | ||
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 | ;; |
940 | esac | 954 | esac |
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} | ||
986 | Les boucles (en anglais: \emph{loops}) servent à indiquer qu'une série | ||
987 | d'instructions doit reprendre et continuer à s'exécuter aussi | ||
988 | longtemps qu'une condition donnée n'est pas remplie. | ||
989 | |||
990 | Prenons un exemple simple. Nous avons dans un répertoire plusieurs | ||
991 | centaines 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 | |||
995 | Pour convertir une seule image, nous pouvons utiliser l'outil en ligne | ||
996 | de commande \verb|convert| fourni par le programme | ||
997 | \emph{imagemagick}\footnote{\url{http://www.imagemagick.org}}. Pour | ||
998 | convertir une seule image, la syntaxe est la suivante: | ||
999 | \begin{minted}{bash} | ||
1000 | convert image.tiff image.png | ||
1001 | \end{minted} | ||
1002 | |||
1003 | Mais comment faire pour en convertir un grand nombre pris dans un | ||
1004 | répertoire qui en compte des centaines enregistrées dans des formats | ||
1005 | différents? | ||
1006 | |||
1007 | \paragraph{basename} | ||
1008 | \index[cmds]{basename|textbf}Avant de continuer, il faut dire un mot | ||
1009 | de la commande \verb|basename| que nous allons utiliser ici. Cette | ||
1010 | commande permet de dépouiller un nom de fichier de son chemin d'accès | ||
1011 | et de son extension. La syntaxe est la suivante: | ||
1012 | \begin{minted}[escapeinside=||]{text} | ||
1013 | basename -s .|\emph{ext}| |\emph{file}| | ||
1014 | \end{minted} | ||
1015 | où \emph{ext} est le nom de l'extension et \emph{file} le nom du | ||
1016 | fichier. Voici un exemple: | ||
1017 | \begin{minted}{text} | ||
1018 | [robert@kiddo fichiers]$ ls -l images/ | ||
1019 | total 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/* | ||
1026 | 02-ascii | ||
1027 | 02-donnees1 | ||
1028 | 02-donnees2 | ||
1029 | 02-exercice_formats | ||
1030 | 02-unicode | ||
1031 | \end{minted} | ||
1032 | |||
1033 | \paragraph{for-do-done} | ||
1034 | \index[cmds]{for|textbf}\index[cmds]{do|textbf}\index[cmds]{done|textbf} | ||
1035 | La 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 | |||
1047 | Voici 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 | ||
1052 | for file in $(basename -s .tiff $(ls *.tiff)) | ||
1053 | do convert "$file".tiff "$file".png | ||
1054 | done | ||
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} |