aboutsummaryrefslogtreecommitdiff
path: root/fichiers
diff options
context:
space:
mode:
authorRobert Alessi <alessi@robertalessi.net>2018-09-18 13:28:08 +0200
committerRobert Alessi <alessi@robertalessi.net>2018-09-18 13:28:08 +0200
commitbd3638c2dd0932176a4bc4660fa58b9abea1e11e (patch)
treec55eef35c376b57c710334dc401dfab428b5d479 /fichiers
parent72028c612738d067ba040c2a6251a296ed7e559c (diff)
downloadcourses-bd3638c2dd0932176a4bc4660fa58b9abea1e11e.tar.gz
03-grep-bash.tex: added variables and substitutions
Diffstat (limited to 'fichiers')
-rw-r--r--fichiers/03-grep-bash.tex162
1 files changed, 162 insertions, 0 deletions
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
472\emph{shell} aurait compris le point comme un préfixe de fichier 472\emph{shell} aurait compris le point comme un préfixe de fichier
473caché. 473caché.
474 474
475\section{Les variables}
476\label{sec:les-variables}
477Les variables sont des informations temporaires qui peuvent être
478stockées et rappelées à tout moment. L'exemple qui suit va donner
479l'occasion d'étudier une nouvelle commande, \verb|echo|, dont le rôle
480est justement de retourner au terminal la chaîne de caractères qu'on
481lui passe en argument:
482\begin{minted}[linenos]{text}
483[robert@kiddo courses]$ mysystem="Linux"
484[robert@kiddo courses]$ echo 'Mon système est $mysystem.'
485Mon système est $mysystem.
486[robert@kiddo courses]$ echo "Mon système est $mysystem."
487Mon système est Linux.
488\end{minted}
489
490\begin{quoting}
491 \textbf{Commentaire:}
492 \begin{description}
493 \item[Définition] Pour \emph{définir une variable}, on lui donne un
494 nom, suivi du signe $=$, suivi de sa définition entre guillemets
495 droits.
496 \item[Rappel] Pour \emph{rappeler} la valeur d'une variable, on
497 saisit le nom qu'on lui a donné, préfixé par le signe \verb|$|.
498 \end{description}
499 \begin{mdframed}[backgroundcolor=Cyan]
500 Observez la différence dans l'usage des guillemets!
501 \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L554}{Comme
502 on le sait}, les guillemets servent à indiquer au \emph{shell}
503 que les espaces ne sont pas des caractères actifs. Il y a
504 cependant une grande différence entre les guillemets simples et
505 les guillemets doubles: les premiers renvoient une expression
506 littérale dans laquelle rien n'est interprété (lignes~2--3) tandis
507 que les seconds permettent l'interprétation des variables
508 (lignes~4--5).
509 \end{mdframed}
510\end{quoting}
511
512Certaines variables sont automatiquement définies par \emph{bash}. Par
513exemple:
514\begin{enumerate}
515\item \verb|$0|: renvoie le nom du script en cours d'exécution.
516\item \verb|$1 - $9|: désignent les arguments successifs passés au
517 script.
518\end{enumerate}
519
520Nous pouvons désormais perfectionner le script \verb|backup.sh|:
521\begin{minted}[linenos]{bash}
522#!/bin/bash
523echo "Veuillez choisir l'extension des fichiers à sauvegarder"
524echo "(sans le point):"
525read -p 'extension: ' ext
526echo "Veuillez choisir le nom du dossier de sauvegarde:"
527read -p 'dossier: ' backupdir
528mkdir "$backupdir"
529cp *.$ext "$backupdir"
530zip -r "$backupdir".zip "$backupdir"
531echo "Terminé. $0 a copié vos fichiers .$ext dans $backupdir"
532echo "et l'archive $backupdir.zip a été créée."
533\end{minted}
534
535\paragraph{read}
536Cette nouvelle commande est expliquée dans le commentaire qui suit:
537\begin{quoting}
538 \textbf{Commentaire:}
539 \begin{enumerate}
540 \item Une nouvelle commande a été introduite ici: aux lignes~4 et 6,
541 \verb|read| attend que l'utilisateur saisisse quelque chose au
542 clavier. Ensuite, la valeur saisie au clavier est associée à une
543 variable qui peut être reprise dans le script. On a également
544 passé à \verb|read| l'option \verb|-p| qui permet d'ajouter un
545 \emph{prompt} spécifique.
546 \item Aux lignes 7, 8 et 9, on a pris la précaution de mettre entre
547 guillemets doubles le rappel de la variable:
548 \verb|"$backupdir"|. On sait en effet que beaucoup d'utilisateurs
549 utilisent les espaces dans les noms des fichiers. Ici, la variable
550 étant rappelée à l'intérieur de guillemets doubles, elle sera
551 toujours interprétée correctement par \emph{bash}.
552 \end{enumerate}
553\end{quoting}
554
555Exécution du script \verb|./backup.sh tex|:
556\begin{minted}[linenos]{text}
557[robert@kiddo courses]$ ./backup.sh
558Veuillez choisir l'extension des fichiers à sauvegarder
559(sans le point):
560extension: tex
561Veuillez choisir le nom du dossier de sauvegarde:
562dossier: Houba
563 adding: Houba/ (stored 0%)
564 adding: Houba/README.tex (deflated 57%)
565 adding: Houba/_preamble.tex (deflated 45%)
566 adding: Houba/_preamble_bbl.tex (deflated 57%)
567 adding: Houba/_preamble-ed.tex (deflated 44%)
568Terminé. ./backup.sh a copié vos fichiers .tex dans Houba
569et l'archive Houba.zip a été créée.
570\end{minted}
571\begin{quoting}
572 \textbf{Commentaire:}
573 \begin{enumerate}
574 \item Les valeurs attendues ont été saisies par l'utilisateur aux
575 lignes~4 et 6.
576 \item À la ligne~12, le script a utilisé la variable \verb|$0| pour
577 retourner son propre nom.
578 \end{enumerate}
579\end{quoting}
580
581\section{Captures et substitutions}
582\label{sec:capt-et-subst}
583Cette technique simple permet de transformer en variable le résultat
584d'une commande. Il suffit de placer la commande entre parenthèses
585précédées du signe $=$. Exemple:
586\begin{minted}[linenos]{text}
587[robert@kiddo courses]$ nbre=$(ls | wc -l)
588[robert@kiddo courses]$ echo $nbre
5898
590\end{minted}
591
592\needspace{2\baselineskip}
593\begin{quoting}
594 \textbf{Commentaire:}
595 \begin{enumerate}
596 \item À la ligne~1, la commande \verb|ls| liste les fichiers, puis
597 son résultat est interprété par \verb|wc -l| qui compte le nombre
598 de fichiers retournés.
599 \item La variable \verb|$nbre| contient donc ce dernier résultat.
600 \end{enumerate}
601\end{quoting}
602
603Utilisons cette technique pour perfectionner notre script
604\verb|backup.sh| (voir ci-dessous la ligne~9):
605\begin{minted}[linenos]{bash}
606#!/bin/bash
607echo "Veuillez choisir l'extension des fichiers à sauvegarder"
608echo "(sans le point):"
609read -p 'extension: ' ext
610echo "Veuillez choisir le nom du dossier de sauvegarde:"
611read -p 'dossier: ' backupdir
612mkdir "$backupdir"
613cp *.$ext "$backupdir"
614nbre=$(ls $backupdir/*.$ext | wc -l)
615zip -r "$backupdir".zip "$backupdir"
616echo "Terminé. $0 a copié $nbre fichiers .$ext dans $backupdir"
617echo "et l'archive $backupdir.zip a été créée."
618\end{minted}
619
620Exécution:
621\begin{minted}[linenos]{text}
622[robert@kiddo courses]$ ./backup.sh
623Veuillez choisir l'extension des fichiers à sauvegarder
624(sans le point):
625extension: tex
626Veuillez choisir le nom du dossier de sauvegarde:
627dossier: Houba
628 adding: Houba/ (stored 0%)
629 adding: Houba/README.tex (deflated 57%)
630 adding: Houba/_preamble.tex (deflated 45%)
631 adding: Houba/_preamble_bbl.tex (deflated 57%)
632 adding: Houba/_preamble-ed.tex (deflated 44%)
633Terminé. ./backup.sh a copié 4 fichiers .tex dans Houba
634et l'archive Houba.zip a été créée.
635\end{minted}
636
475\hfill\verb|../..| à suivre 637\hfill\verb|../..| à suivre
476 638
477\end{document} 639\end{document}