From f4f700e2deed3bbe6ab07a172d3659138e155fbc Mon Sep 17 00:00:00 2001
From: Robert Alessi <alessi@robertalessi.net>
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
-
-# <destination> 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 <destination> 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
-
-# <destination> 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 <destination> 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

