From 645898a86597b111c9e6ea1f1467010adb8816ac Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Thu, 20 Sep 2018 12:05:45 +0200 Subject: 03-grep-bash.tex: indentation --- fichiers/03-grep-bash.tex | 101 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 7 deletions(-) (limited to 'fichiers') 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 @@ \input{../_preamble_bbl} \usepackage{menukeys} \title{grep et bash} +\publishers{\url{https://notabug.org/ralessi/courses/}} \usepackage{units} \usepackage{cleveref} \usepackage{booktabs} @@ -11,6 +12,7 @@ \mdfsetup{ backgroundcolor=Lavender, hidealllines=true} +\usepackage{float} \usepackage[newfloat]{minted} \SetupFloatingEnvironment{listing}{listname=Listings} \surroundwithmdframed{minted} @@ -19,7 +21,6 @@ breaksymbolright=\small\carriagereturn} \setmintedinline{bgcolor=Lavender} \usepackage{soul} - \begin{document} \maketitle \renewcommand{\contentsname}{Sommaire} @@ -647,7 +648,7 @@ sauvegarde, il ne contrôle pas si ce répertoire existe déjà, ce qui est un défaut. Voici comment on peut créer une condition adaptée à cette situation: \begin{minted}[linenos]{bash} -if [ -d $backupdir ] +if [ -d "$backupdir" ] then echo "Le dossier $backupdir existe déjà. Veuillez relancer le" echo "programme et saisir un autre nom." @@ -664,7 +665,7 @@ fi \item ligne 1: \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| + \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}; @@ -684,7 +685,7 @@ fi Voici donc comment se présente le script \verb|backup.sh| une fois la condition insérée: -\begin{listing}[h] +\begin{listing}[H] \begin{minted}[linenos,highlightlines={7-14}]{bash} #!/bin/bash echo "Veuillez choisir l'extension des fichiers à sauvegarder" @@ -692,7 +693,7 @@ echo "(sans le point):" read -p 'extension: ' ext echo "Veuillez choisir le nom du dossier de sauvegarde:" read -p 'dossier: ' backupdir -if [ -d $backupdir ] +if [ -d "$backupdir" ] then echo "Le dossier $backupdir existe déjà. Veuillez relancer le" echo "programme et saisir un autre nom." @@ -706,10 +707,60 @@ zip -r "$backupdir".zip "$backupdir" echo "Terminé. $0 a copié $nbre fichiers .$ext dans $backupdir" echo "et l'archive $backupdir.zip a été créée." \end{minted} -\caption{bash: exemple de condition if-then-else} +\caption{bash: exemple de condition \texttt{if-then-else}} \label{lst:if-then-else} \end{listing} +\subsection{Conditions en série} +\label{sec:conditions-en-serie} +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: +\begin{minted}{bash} +elif [ -e "$backupdir".zip ] + then + echo "L'archive $backupdir.zip existe déjà. Veuillez la supprimer" + echo "ou la déplacer en dehors de ce dossier, puis relancez le" + echo "programme." + exit 1 +\end{minted} + +Ce qui donne le script \verb|backup.sh| suivant: +\begin{listing}[H] +\begin{minted}[linenos,highlightlines={12-17}]{bash} +#!/bin/bash +echo "Veuillez choisir l'extension des fichiers à sauvegarder" +echo "(sans le point):" +read -p 'extension: ' ext +echo "Veuillez choisir le nom du dossier de sauvegarde:" +read -p 'dossier: ' backupdir +if [ -d "$backupdir" ] + then + echo "Le dossier $backupdir existe déjà. Veuillez relancer le" + echo "programme et saisir un autre nom." + exit 1 +elif [ -e "$backupdir".zip ] + then + echo "L'archive $backupdir.zip existe déjà. Veuillez la supprimer" + echo "ou la déplacer en dehors de ce dossier, puis relancez le" + echo "programme." + exit 1 +else + mkdir "$backupdir" +fi +cp *.$ext "$backupdir" +nbre=$(ls $backupdir/*.$ext | wc -l) +zip -r "$backupdir".zip "$backupdir" +echo "Terminé. $0 a copié $nbre fichiers .$ext dans $backupdir" +echo "et l'archive $backupdir.zip a été créée." +\end{minted} +\caption{bash: instruction \texttt{elif}} +\end{listing} + \subsection{Tests} \label{sec:tests} 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}. À 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 faux. Le terminal ne +\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: @@ -779,6 +830,42 @@ fichiers _preamble_bbl.tex _preamble.log README.md arithmétique. \end{quoting} +\subsection{Indentation} +\label{sec:indentation} +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). + +Cette technique est commune à tous les langages informatiques et tous +les programmeurs l'utilisent. En Python, que nous étudierons plus +tard, l'indendation fait même partie du langage lui-même, puisque +Python a recours à l'indentation pour structurer les blocs logiques, à +la différence d'autres langages qui ont recours soit à des +déclarations explicites telles que \verb|begin ... end| ou encore à +des opérateurs tels que \verb|{ ... }| + +Voici un exemple d'une structure dans laquelle on a placé une +condition à l'intérieur d'une autre condition: +\begin{listing}[H] +\begin{minted}[linenos]{bash} +#!/bin/bash +if [ $1 -gt 10 ] +then + echo "$1 est supérieur à 10" + if [ $1 -gt 100 ] + then + echo "et $1 est même supérieur à 100!" + fi +else + echo "Il faut aller au-dessus de 10 pour avoir une réponse!" +fi +\end{minted} +\caption{bash: exemple d'indentation} +\end{listing} + \hfill\verb|../..| à suivre \end{document} -- cgit v1.2.3