diff options
-rw-r--r-- | _preamble.tex | 5 | ||||
-rw-r--r-- | fichiers/03-grep-bash.tex | 101 |
2 files changed, 98 insertions, 8 deletions
diff --git a/_preamble.tex b/_preamble.tex index 377ebe5..e120d23 100644 --- a/_preamble.tex +++ b/_preamble.tex | |||
@@ -10,6 +10,9 @@ | |||
10 | \usepackage[svgnames]{xcolor} | 10 | \usepackage[svgnames]{xcolor} |
11 | \usepackage{needspace} | 11 | \usepackage{needspace} |
12 | 12 | ||
13 | \usepackage{graphicx} | ||
14 | \graphicspath{{images/}} | ||
15 | |||
13 | \usepackage[french]{varioref} | 16 | \usepackage[french]{varioref} |
14 | \usepackage{hyperref} | 17 | \usepackage{hyperref} |
15 | \hypersetup{unicode,colorlinks,allcolors=blue,linktocpage} | 18 | \hypersetup{unicode,colorlinks,allcolors=blue,linktocpage} |
@@ -23,4 +26,4 @@ | |||
23 | \usepackage{widows-and-orphans} | 26 | \usepackage{widows-and-orphans} |
24 | \WaOsetup{avoid-all} | 27 | \WaOsetup{avoid-all} |
25 | 28 | ||
26 | \usepackage{microtype} | 29 | \usepackage{microtype} \ No newline at end of file |
diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex index 4ce1bba..e4b6a71 100644 --- a/fichiers/03-grep-bash.tex +++ b/fichiers/03-grep-bash.tex | |||
@@ -2,6 +2,7 @@ | |||
2 | \input{../_preamble_bbl} | 2 | \input{../_preamble_bbl} |
3 | \usepackage{menukeys} | 3 | \usepackage{menukeys} |
4 | \title{grep et bash} | 4 | \title{grep et bash} |
5 | \publishers{\url{https://notabug.org/ralessi/courses/}} | ||
5 | \usepackage{units} | 6 | \usepackage{units} |
6 | \usepackage{cleveref} | 7 | \usepackage{cleveref} |
7 | \usepackage{booktabs} | 8 | \usepackage{booktabs} |
@@ -11,6 +12,7 @@ | |||
11 | \mdfsetup{ | 12 | \mdfsetup{ |
12 | backgroundcolor=Lavender, | 13 | backgroundcolor=Lavender, |
13 | hidealllines=true} | 14 | hidealllines=true} |
15 | \usepackage{float} | ||
14 | \usepackage[newfloat]{minted} | 16 | \usepackage[newfloat]{minted} |
15 | \SetupFloatingEnvironment{listing}{listname=Listings} | 17 | \SetupFloatingEnvironment{listing}{listname=Listings} |
16 | \surroundwithmdframed{minted} | 18 | \surroundwithmdframed{minted} |
@@ -19,7 +21,6 @@ | |||
19 | breaksymbolright=\small\carriagereturn} | 21 | breaksymbolright=\small\carriagereturn} |
20 | \setmintedinline{bgcolor=Lavender} | 22 | \setmintedinline{bgcolor=Lavender} |
21 | \usepackage{soul} | 23 | \usepackage{soul} |
22 | |||
23 | \begin{document} | 24 | \begin{document} |
24 | \maketitle | 25 | \maketitle |
25 | \renewcommand{\contentsname}{Sommaire} | 26 | \renewcommand{\contentsname}{Sommaire} |
@@ -647,7 +648,7 @@ sauvegarde, il ne contrôle pas si ce répertoire existe déjà, ce qui est | |||
647 | un défaut. Voici comment on peut créer une condition adaptée à cette | 648 | un défaut. Voici comment on peut créer une condition adaptée à cette |
648 | situation: | 649 | situation: |
649 | \begin{minted}[linenos]{bash} | 650 | \begin{minted}[linenos]{bash} |
650 | if [ -d $backupdir ] | 651 | if [ -d "$backupdir" ] |
651 | then | 652 | then |
652 | echo "Le dossier $backupdir existe déjà. Veuillez relancer le" | 653 | echo "Le dossier $backupdir existe déjà. Veuillez relancer le" |
653 | echo "programme et saisir un autre nom." | 654 | echo "programme et saisir un autre nom." |
@@ -664,7 +665,7 @@ fi | |||
664 | \item ligne 1: \mintinline{bash}|if| $\rightarrow$ \emph{si | 665 | \item ligne 1: \mintinline{bash}|if| $\rightarrow$ \emph{si |
665 | <condition>} où la condition est posée entre crochets. Dans | 666 | <condition>} où la condition est posée entre crochets. Dans |
666 | l'expression entre les crochets, % | 667 | l'expression entre les crochets, % |
667 | \verb|-d $backupdir|, \verb|-d| signifie: \verb|$backupdir| | 668 | \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir| |
668 | existe \emph{et} est un répertoire; | 669 | existe \emph{et} est un répertoire; |
669 | \item ligne 2: \mintinline{bash}|then| $\rightarrow$ \emph{alors, | 670 | \item ligne 2: \mintinline{bash}|then| $\rightarrow$ \emph{alors, |
670 | passez à la ligne suivante}; | 671 | passez à la ligne suivante}; |
@@ -684,7 +685,7 @@ fi | |||
684 | 685 | ||
685 | Voici donc comment se présente le script \verb|backup.sh| une fois la | 686 | Voici donc comment se présente le script \verb|backup.sh| une fois la |
686 | condition insérée: | 687 | condition insérée: |
687 | \begin{listing}[h] | 688 | \begin{listing}[H] |
688 | \begin{minted}[linenos,highlightlines={7-14}]{bash} | 689 | \begin{minted}[linenos,highlightlines={7-14}]{bash} |
689 | #!/bin/bash | 690 | #!/bin/bash |
690 | echo "Veuillez choisir l'extension des fichiers à sauvegarder" | 691 | echo "Veuillez choisir l'extension des fichiers à sauvegarder" |
@@ -692,7 +693,7 @@ echo "(sans le point):" | |||
692 | read -p 'extension: ' ext | 693 | read -p 'extension: ' ext |
693 | echo "Veuillez choisir le nom du dossier de sauvegarde:" | 694 | echo "Veuillez choisir le nom du dossier de sauvegarde:" |
694 | read -p 'dossier: ' backupdir | 695 | read -p 'dossier: ' backupdir |
695 | if [ -d $backupdir ] | 696 | if [ -d "$backupdir" ] |
696 | then | 697 | then |
697 | echo "Le dossier $backupdir existe déjà. Veuillez relancer le" | 698 | echo "Le dossier $backupdir existe déjà. Veuillez relancer le" |
698 | echo "programme et saisir un autre nom." | 699 | echo "programme et saisir un autre nom." |
@@ -706,10 +707,60 @@ zip -r "$backupdir".zip "$backupdir" | |||
706 | echo "Terminé. $0 a copié $nbre fichiers .$ext dans $backupdir" | 707 | echo "Terminé. $0 a copié $nbre fichiers .$ext dans $backupdir" |
707 | echo "et l'archive $backupdir.zip a été créée." | 708 | echo "et l'archive $backupdir.zip a été créée." |
708 | \end{minted} | 709 | \end{minted} |
709 | \caption{bash: exemple de condition if-then-else} | 710 | \caption{bash: exemple de condition \texttt{if-then-else}} |
710 | \label{lst:if-then-else} | 711 | \label{lst:if-then-else} |
711 | \end{listing} | 712 | \end{listing} |
712 | 713 | ||
714 | \subsection{Conditions en série} | ||
715 | \label{sec:conditions-en-serie} | ||
716 | 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 | ||
718 | script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons | ||
719 | utiliser dans le script l'instruction \verb|elif| qui permet de | ||
720 | construire des conditions en série. Littéralement, \verb|elif| est | ||
721 | pour \emph{else if}, \enquote{ou autrement, si\ldots}. Voici donc ce | ||
722 | qu'il faut ajouter: | ||
723 | \begin{minted}{bash} | ||
724 | elif [ -e "$backupdir".zip ] | ||
725 | then | ||
726 | echo "L'archive $backupdir.zip existe déjà. Veuillez la supprimer" | ||
727 | echo "ou la déplacer en dehors de ce dossier, puis relancez le" | ||
728 | echo "programme." | ||
729 | exit 1 | ||
730 | \end{minted} | ||
731 | |||
732 | Ce qui donne le script \verb|backup.sh| suivant: | ||
733 | \begin{listing}[H] | ||
734 | \begin{minted}[linenos,highlightlines={12-17}]{bash} | ||
735 | #!/bin/bash | ||
736 | echo "Veuillez choisir l'extension des fichiers à sauvegarder" | ||
737 | echo "(sans le point):" | ||
738 | read -p 'extension: ' ext | ||
739 | echo "Veuillez choisir le nom du dossier de sauvegarde:" | ||
740 | read -p 'dossier: ' backupdir | ||
741 | if [ -d "$backupdir" ] | ||
742 | then | ||
743 | echo "Le dossier $backupdir existe déjà. Veuillez relancer le" | ||
744 | echo "programme et saisir un autre nom." | ||
745 | exit 1 | ||
746 | elif [ -e "$backupdir".zip ] | ||
747 | then | ||
748 | echo "L'archive $backupdir.zip existe déjà. Veuillez la supprimer" | ||
749 | echo "ou la déplacer en dehors de ce dossier, puis relancez le" | ||
750 | echo "programme." | ||
751 | exit 1 | ||
752 | else | ||
753 | mkdir "$backupdir" | ||
754 | fi | ||
755 | cp *.$ext "$backupdir" | ||
756 | nbre=$(ls $backupdir/*.$ext | wc -l) | ||
757 | zip -r "$backupdir".zip "$backupdir" | ||
758 | echo "Terminé. $0 a copié $nbre fichiers .$ext dans $backupdir" | ||
759 | echo "et l'archive $backupdir.zip a été créée." | ||
760 | \end{minted} | ||
761 | \caption{bash: instruction \texttt{elif}} | ||
762 | \end{listing} | ||
763 | |||
713 | \subsection{Tests} | 764 | \subsection{Tests} |
714 | \label{sec:tests} | 765 | \label{sec:tests} |
715 | Le tableau suivant donne la liste des tests les plus répandus que l'on | 766 | Le tableau suivant donne la liste des tests les plus répandus que l'on |
@@ -748,7 +799,7 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}. | |||
748 | À l'intérieur du script \verb|bash|, les crochets renvoient en fait à | 799 | À l'intérieur du script \verb|bash|, les crochets renvoient en fait à |
749 | une commande par ailleurs disponible: \verb|test|. La commande | 800 | une commande par ailleurs disponible: \verb|test|. La commande |
750 | \verb|test| renvoie en fait la sortie \verb|0| si le résultat est | 801 | \verb|test| renvoie en fait la sortie \verb|0| si le résultat est |
751 | \emph{vrai} et \verb|1| si le résultat est faux. Le terminal ne | 802 | \emph{vrai} et \verb|1| si le résultat est \emph{faux}. Le terminal ne |
752 | retourne pas le resultat, mais celui-ci est associé à une variable | 803 | retourne pas le resultat, mais celui-ci est associé à une variable |
753 | \verb|$?| que l'on peut afficher par la commande: | 804 | \verb|$?| que l'on peut afficher par la commande: |
754 | \mintinline{bash}|echo $?|. En voici quelques exemples: | 805 | \mintinline{bash}|echo $?|. En voici quelques exemples: |
@@ -779,6 +830,42 @@ fichiers _preamble_bbl.tex _preamble.log README.md | |||
779 | arithmétique. | 830 | arithmétique. |
780 | \end{quoting} | 831 | \end{quoting} |
781 | 832 | ||
833 | \subsection{Indentation} | ||
834 | \label{sec:indentation} | ||
835 | L'indentation est une technique qui consiste à donner aux lignes de | ||
836 | code différentes profondeurs de marge à gauche de façon à distinguer | ||
837 | clairement des blocs logiques. Les lignes 7--20 du | ||
838 | \vref{lst:if-then-else} en donnent un exemple. L'indentation permet de | ||
839 | faire apparaître clairement ce qui dépend de l'instruction \verb|if| | ||
840 | (l.~7), puis \verb|elif| (l.~12) et enfin \verb|else| (l.~18). | ||
841 | |||
842 | Cette technique est commune à tous les langages informatiques et tous | ||
843 | les programmeurs l'utilisent. En Python, que nous étudierons plus | ||
844 | tard, l'indendation fait même partie du langage lui-même, puisque | ||
845 | Python a recours à l'indentation pour structurer les blocs logiques, à | ||
846 | la différence d'autres langages qui ont recours soit à des | ||
847 | déclarations explicites telles que \verb|begin ... end| ou encore à | ||
848 | des opérateurs tels que \verb|{ ... }| | ||
849 | |||
850 | Voici un exemple d'une structure dans laquelle on a placé une | ||
851 | condition à l'intérieur d'une autre condition: | ||
852 | \begin{listing}[H] | ||
853 | \begin{minted}[linenos]{bash} | ||
854 | #!/bin/bash | ||
855 | if [ $1 -gt 10 ] | ||
856 | then | ||
857 | echo "$1 est supérieur à 10" | ||
858 | if [ $1 -gt 100 ] | ||
859 | then | ||
860 | echo "et $1 est même supérieur à 100!" | ||
861 | fi | ||
862 | else | ||
863 | echo "Il faut aller au-dessus de 10 pour avoir une réponse!" | ||
864 | fi | ||
865 | \end{minted} | ||
866 | \caption{bash: exemple d'indentation} | ||
867 | \end{listing} | ||
868 | |||
782 | \hfill\verb|../..| à suivre | 869 | \hfill\verb|../..| à suivre |
783 | 870 | ||
784 | \end{document} | 871 | \end{document} |