From f4f700e2deed3bbe6ab07a172d3659138e155fbc Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Thu, 27 Sep 2018 11:44:38 +0200 Subject: made scripts available in a separate directory --- fichiers/03-grep-bash.tex | 253 ++++------------------------------------------ 1 file changed, 18 insertions(+), 235 deletions(-) (limited to 'fichiers/03-grep-bash.tex') diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex index 8b9c78e..c4c5f05 100644 --- a/fichiers/03-grep-bash.tex +++ b/fichiers/03-grep-bash.tex @@ -22,6 +22,12 @@ {\index[cmds]{#2@\texttt{#2}#3}} } +\NewDocumentCommand{\inputfile}{O{} m m O{application/x-sh}}{ + \attachandlink{scripts/#3}[#4]{Fichier + attaché}{\marginpar{\textcolor{blue}{Ouvrir le fichier}}} + \inputminted[#1]{#2}{scripts/#3} +} + \begin{document} \maketitle \renewcommand{\contentsname}{Sommaire} @@ -700,29 +706,9 @@ fi Voici donc comment se présente le script \verb|backup.sh| une fois la condition insérée: -\begin{minted}[linenos,highlightlines={7-14}]{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 -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} \captionof{listing}{bash: exemple de condition \texttt{if-then-else}% \label{lst:if-then-else}} +\inputfile[linenos,highlightlines={7-14}]{bash}{backup.sh} \subsection{Conditions en série} \label{sec:conditions-en-serie} @@ -743,35 +729,9 @@ elif [ -e "$backupdir".zip ] exit 1 \end{minted} -Ce qui donne le script \verb|backup.sh| suivant: -\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} +Ce qui donne le script \verb|backup-mk2.sh| suivant: \captionof{listing}{bash: instruction \texttt{elif}\label{lst:elif}} +\inputfile[linenos,highlightlines={12-17}]{bash}{backup-mk2.sh} \subsection{Tests} \label{sec:tests} @@ -865,20 +825,8 @@ des opérateurs tels que \verb|{ ... }| Voici un exemple d'indentation d'une structure dans laquelle on a placé une condition à l'intérieur d'une autre condition: -\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} \captionof{listing}{bash: exemple d'indentation} +\inputfile[linenos]{bash}{greaterthan.sh} \subsection{Opérateurs booléens} \label{sec:operateurs-booleens} @@ -935,25 +883,8 @@ esac Le \vref{lst:case} montre un exemple facile à comprendre de cette technique. -\begin{minted}[linenos]{bash} -#!/bin/bash - -echo "Entre le chien et le chat, quel est votre animal préféré?" -read -p 'Saisissez votre réponse: ' animal - -case $animal in - [Cc]hien) - echo "Vous avez bien raison, le chien est le meilleur ami de l'homme." - ;; - [Cc]hat) - echo "Après le chien, c'était un en effet un choix possible." - ;; - *) - echo "Faites un effort, vous n'avez pas compris la question." - ;; -esac -\end{minted} \captionof{listing}{bash: instruction \texttt{case}\label{lst:case}} +\inputfile[linenos]{bash}{animal.sh} \begin{quoting} \textbf{Commentaire:} \begin{enumerate} @@ -1045,13 +976,8 @@ La boucle que nous allons utiliser fait appel à trois instructions: Voici maintenant le script qui assure la conversion du format \verb|.tiff| vers le format \verb|.png|: -\begin{minted}[linenos]{bash} -#!/bin/bash -for file in $(basename -s .tiff $(ls *.tiff)) - do convert "$file".tiff "$file".png -done -\end{minted} \captionof{listing}{bash: \texttt{for ... do ... done}} +\inputfile[linenos]{bash}{tiff2png.sh} \begin{quoting} \textbf{Commentaire:} @@ -1084,34 +1010,8 @@ script \verb|countlines.sh|, donné dans le \cref{lst:countlines} ci-dessous, utilise cette expression pour compter les lignes des fichiers\footnote{Pour une autre façon plus simple d'écrire le même programme, voir le \vref{lst:countlines-mk2}.}. -\begin{minted}[linenos,highlightlines={13,16-17}]{bash} -#!/bin/bash - -echo "Entrez le nom du fichier dont vous voulez compter les lignes:" -read -p 'Fichier: ' file - -numline=0 - -if [ ! -e $file ] || [ -z $file ] - then - echo "Erreur: le fichier $file n'existe pas." - exit 1 - else - while read -r line - # 'let' permet de poser des opérations arithmétiques; - # à la place, on aurait pu écrire: do ((++numline)) - do let "numline = numline + 1" - done < $file -fi - -if [ $numline -le 1 ] - then - echo "Votre fichier $file compte $numline ligne." - else - echo "Votre fichier $file compte $numline lignes." -fi -\end{minted} \captionof{listing}{bash: \texttt{while}\label{lst:countlines}} +\inputfile[linenos,highlightlines={13,16-17}]{bash}{countlines.sh} \paragraph{read} \label{ref:read-plus}\commande*{read} @@ -1180,22 +1080,8 @@ le résultat du test associé à \verb|until| devient \emph{positif} (\emph{true}). Pour prendre un exemple très simple, le script suivant, que l'on appellera \verb|roar.sh|, demande combien de fois on souhaite tirer la queue d'un lion: -\begin{minted}[linenos]{bash} -#!/bin/bash - -read -p 'Combien de fois tirez-vous la queue du lion? ' rahtimes - -# Définition du compteur de rugissements: -rah=1 - -until [ $rah -gt $rahtimes ] -do - echo "Raaaaaaaaahhhhhhhhhhhh! ($rah)" - sleep 1 - ((++rah)) -done -\end{minted} \captionof{listing}{bash: comment faire rugir le lion?} +\inputfile[linenos]{bash}{rah.sh} \begin{quoting} \textbf{Commentaire:} @@ -1228,45 +1114,9 @@ trouve. Supposons par exemple que l'on écrive un programme dans lequel on souhaite limiter une action telle que la copie de fichiers. L'instruction \verb|break| sera exécutée dès que la limite est atteinte. Appelons ce script \verb|copyten.sh|: -\begin{minted}[linenos]{bash} -#!/bin/bash - -# création du compteur de fichiers copiés. -countfiles=0 - -# On demande quels fichiers doivent être copiés. Mais avant cela, on -# explique à l'utilisateur ce que fait ce programme. -echo "Attention: ce programme copie au maximum 10 fichiers." -read -p 'Que souhaitez-vous copier: ' files - -# On demande la destination: -read -p 'Répertoire de destination: ' dest - -# doit être un répertoire: -if [ ! -d $dest ] -then - echo "Erreur: la destination doit être un répertoire." - echo " Le cas échéant, utilisez \"mkdir $dest\"" - echo " pour créer le répertoire de destination." - exit 1 -else # Si est un répertoire, alors pour chaque fichier - # copié on incrémente le compteur. Et dès que le compteur - # atteint le chiffre de 10, on sort de la boucle. - for file in $files # pour chaque fichier à copier - do - cp $file $dest - let "countfiles = countfiles + 1" - if [ $countfiles -eq 10 ] - then - break # sortie de la boucle - fi - done -fi - -echo "Terminé. 10 fichiers au maximum ont été copiés dans $dest." -\end{minted} \captionof{listing}{bash: copie d'un nombre limité de fichiers\label{lst:copyten}} +\inputfile[linenos]{bash}{copyten.sh} Ce script donne un exemple de code commenté. Comme on le voit, les commentaires peuvent se trouver sur des lignes isolées aussi bien que @@ -1304,51 +1154,9 @@ partir de l'itération suivante. C'est une façon de prévoir des exceptions. Par exemple, nous pouvons modifier le script \ref{lst:copyten} comme suit: -\begin{minted}[linenos,highlightlines={26-31}]{bash} -#!/bin/bash - -# création du compteur de fichiers copiés. -countfiles=0 - -# On demande quels fichiers doivent être copiés. Mais avant cela, on -# explique à l'utilisateur ce que fait ce programme. -echo "Attention: ce programme copie au maximum 10 fichiers." -read -p 'Que souhaitez-vous copier: ' files - -# On demande la destination: -read -p 'Répertoire de destination: ' dest - -# doit être un répertoire: -if [ ! -d $dest ] -then - echo "Erreur: la destination doit être un répertoire." - echo " Le cas échéant, utilisez \"mkdir $dest\"" - echo " pour créer le répertoire de destination." - exit 1 -else # Si est un répertoire, alors pour chaque fichier - # copié on incrémente le compteur. Et dès que le compteur - # atteint le chiffre de 10, on sort de la boucle. - for file in $files # pour chaque fichier à copier - do - if [ ! -e $file ] # si le fichier à copier n'exite pas - then - echo "création de $file qui n'existe pas..." - touch $dest/$file - continue # arrêter ici et reprendre à la l. 24 - fi - cp $file $dest - let "countfiles = countfiles + 1" - if [ $countfiles -eq 10 ] - then - break # sortie de la boucle - fi - done -fi - -echo "Terminé. 10 fichiers au maximum ont été copiés dans $dest." -\end{minted} \captionof{listing}{bash: copie d'un nombre limité de fichiers sans échec si le fichier source n'existe pas} +\inputfile[linenos,highlightlines={26-31}]{bash}{copyten-mk2.sh} \begin{quoting} \textbf{Commentaire:} @@ -1364,7 +1172,7 @@ echo "Terminé. 10 fichiers au maximum ont été copiés dans $dest." Voici ce que donne l'exécution de ce script: \begin{minted}{text} -[robert@kiddo courses]$ ./copyten.sh +[robert@kiddo courses]$ ./copyten-mk2.sh Attention: ce programme copie au maximum 10 fichiers. Que souhaitez-vous copier: tchic.txt Répertoire de destination: Houba @@ -1401,34 +1209,9 @@ rien entre les parenthèses qui sont purement décoratives. Le script suivant permet de parvenir au même résultat que le script qui a été présenté dans le \vref{lst:countlines}: -\begin{minted}[linenos]{bash} -#!/bin/bash - -echo "Entrez le nom du fichier dont vous voulez compter les lignes:" -read -p 'Fichier: ' file - -countlines () { - cat $1 | wc -l -} - -if [ ! -e $file ] || [ -z $file ] - then - echo "Erreur: le fichier $file n'existe pas." - exit 1 - else - numline=$(countlines $file) -fi - -if [ $numline -le 1 ] - then - echo "Votre fichier $file compte $numline ligne." - else - echo "Votre fichier $file compte $numline lignes." -fi -\end{minted} -\enlargethispage{2\baselineskip} \captionof{listing}{bash: exemple de fonction\label{lst:countlines-mk2}} +\inputfile[linenos]{bash}{countlines-mk2.sh} Pour terminer, exécutons cette nouvelle version de notre script ici appelée \verb|countlines-mk2.sh|: -- cgit v1.2.3