From bd3638c2dd0932176a4bc4660fa58b9abea1e11e Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Tue, 18 Sep 2018 13:28:08 +0200 Subject: 03-grep-bash.tex: added variables and substitutions --- _preamble.tex | 1 + fichiers/03-grep-bash.tex | 162 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) diff --git a/_preamble.tex b/_preamble.tex index 5573be8..5c3a499 100644 --- a/_preamble.tex +++ b/_preamble.tex @@ -8,6 +8,7 @@ \usepackage{csquotes} \usepackage[font=footnotesize, rightmargin=0pt]{quoting} \usepackage[svgnames]{xcolor} +\usepackage{needspace} \usepackage[french]{varioref} \usepackage{hyperref} diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex index 638adfd..26409f9 100644 --- a/fichiers/03-grep-bash.tex +++ b/fichiers/03-grep-bash.tex @@ -472,6 +472,168 @@ qu'il s'agit d'un chemin d'accès. Sans le \emph{slash}, le \emph{shell} aurait compris le point comme un préfixe de fichier caché. +\section{Les variables} +\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: +\begin{minted}[linenos]{text} +[robert@kiddo courses]$ mysystem="Linux" +[robert@kiddo courses]$ echo 'Mon système est $mysystem.' +Mon système est $mysystem. +[robert@kiddo courses]$ echo "Mon système est $mysystem." +Mon système est Linux. +\end{minted} + +\begin{quoting} + \textbf{Commentaire:} + \begin{description} + \item[Définition] Pour \emph{définir une variable}, on lui donne un + nom, suivi du signe $=$, suivi de sa définition entre guillemets + droits. + \item[Rappel] Pour \emph{rappeler} la valeur d'une variable, on + saisit le nom qu'on lui a donné, préfixé par le signe \verb|$|. + \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 + 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 + les guillemets doubles: les premiers renvoient une expression + littérale dans laquelle rien n'est interprété (lignes~2--3) tandis + que les seconds permettent l'interprétation des variables + (lignes~4--5). + \end{mdframed} +\end{quoting} + +Certaines variables sont automatiquement définies par \emph{bash}. Par +exemple: +\begin{enumerate} +\item \verb|$0|: renvoie le nom du script en cours d'exécution. +\item \verb|$1 - $9|: désignent les arguments successifs passés au + script. +\end{enumerate} + +Nous pouvons désormais perfectionner le script \verb|backup.sh|: +\begin{minted}[linenos]{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 +mkdir "$backupdir" +cp *.$ext "$backupdir" +zip -r "$backupdir".zip "$backupdir" +echo "Terminé. $0 a copié vos fichiers .$ext dans $backupdir" +echo "et l'archive $backupdir.zip a été créée." +\end{minted} + +\paragraph{read} +Cette nouvelle commande est expliquée dans le commentaire qui suit: +\begin{quoting} + \textbf{Commentaire:} + \begin{enumerate} + \item Une nouvelle commande a été introduite ici: aux lignes~4 et 6, + \verb|read| attend que l'utilisateur saisisse quelque chose au + clavier. Ensuite, la valeur saisie au clavier est associée à une + variable qui peut être reprise dans le script. On a également + passé à \verb|read| l'option \verb|-p| qui permet d'ajouter un + \emph{prompt} spécifique. + \item Aux lignes 7, 8 et 9, on a pris la précaution de mettre entre + guillemets doubles le rappel de la variable: + \verb|"$backupdir"|. On sait en effet que beaucoup d'utilisateurs + utilisent les espaces dans les noms des fichiers. Ici, la variable + étant rappelée à l'intérieur de guillemets doubles, elle sera + toujours interprétée correctement par \emph{bash}. + \end{enumerate} +\end{quoting} + +Exécution du script \verb|./backup.sh tex|: +\begin{minted}[linenos]{text} +[robert@kiddo courses]$ ./backup.sh +Veuillez choisir l'extension des fichiers à sauvegarder +(sans le point): +extension: tex +Veuillez choisir le nom du dossier de sauvegarde: +dossier: Houba + adding: Houba/ (stored 0%) + adding: Houba/README.tex (deflated 57%) + adding: Houba/_preamble.tex (deflated 45%) + adding: Houba/_preamble_bbl.tex (deflated 57%) + adding: Houba/_preamble-ed.tex (deflated 44%) +Terminé. ./backup.sh a copié vos fichiers .tex dans Houba +et l'archive Houba.zip a été créée. +\end{minted} +\begin{quoting} + \textbf{Commentaire:} + \begin{enumerate} + \item Les valeurs attendues ont été saisies par l'utilisateur aux + lignes~4 et 6. + \item À la ligne~12, le script a utilisé la variable \verb|$0| pour + retourner son propre nom. + \end{enumerate} +\end{quoting} + +\section{Captures et substitutions} +\label{sec:capt-et-subst} +Cette technique simple permet de transformer en variable le résultat +d'une commande. Il suffit de placer la commande entre parenthèses +précédées du signe $=$. Exemple: +\begin{minted}[linenos]{text} +[robert@kiddo courses]$ nbre=$(ls | wc -l) +[robert@kiddo courses]$ echo $nbre +8 +\end{minted} + +\needspace{2\baselineskip} +\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 variable \verb|$nbre| contient donc ce dernier résultat. + \end{enumerate} +\end{quoting} + +Utilisons cette technique pour perfectionner notre script +\verb|backup.sh| (voir ci-dessous la ligne~9): +\begin{minted}[linenos]{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 +mkdir "$backupdir" +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} + +Exécution: +\begin{minted}[linenos]{text} +[robert@kiddo courses]$ ./backup.sh +Veuillez choisir l'extension des fichiers à sauvegarder +(sans le point): +extension: tex +Veuillez choisir le nom du dossier de sauvegarde: +dossier: Houba + adding: Houba/ (stored 0%) + adding: Houba/README.tex (deflated 57%) + adding: Houba/_preamble.tex (deflated 45%) + adding: Houba/_preamble_bbl.tex (deflated 57%) + adding: Houba/_preamble-ed.tex (deflated 44%) +Terminé. ./backup.sh a copié 4 fichiers .tex dans Houba +et l'archive Houba.zip a été créée. +\end{minted} + \hfill\verb|../..| à suivre \end{document} -- cgit v1.2.3