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 --- _preamble.tex | 5 +- fichiers/03-grep-bash.tex | 253 +++---------------------------------- fichiers/scripts/animal.sh | 16 +++ fichiers/scripts/backup-mk2.sh | 25 ++++ fichiers/scripts/backup.sh | 19 +++ fichiers/scripts/copyten-mk2.sh | 41 ++++++ fichiers/scripts/copyten.sh | 35 +++++ fichiers/scripts/countlines-mk2.sh | 23 ++++ fichiers/scripts/countlines.sh | 25 ++++ fichiers/scripts/greaterthan.sh | 11 ++ fichiers/scripts/rah.sh | 13 ++ fichiers/scripts/tiff2png.sh | 4 + makefile | 3 +- 13 files changed, 234 insertions(+), 239 deletions(-) create mode 100644 fichiers/scripts/animal.sh create mode 100644 fichiers/scripts/backup-mk2.sh create mode 100644 fichiers/scripts/backup.sh create mode 100644 fichiers/scripts/copyten-mk2.sh create mode 100644 fichiers/scripts/copyten.sh create mode 100644 fichiers/scripts/countlines-mk2.sh create mode 100644 fichiers/scripts/countlines.sh create mode 100644 fichiers/scripts/greaterthan.sh create mode 100644 fichiers/scripts/rah.sh create mode 100644 fichiers/scripts/tiff2png.sh diff --git a/_preamble.tex b/_preamble.tex index 682ea4a..19c71b0 100644 --- a/_preamble.tex +++ b/_preamble.tex @@ -31,10 +31,11 @@ delim_0 ",\~" \usepackage{imakeidx} \usepackage{xparse} -\usepackage[unicode=true]{hyperref} -\hypersetup{colorlinks,allcolors=blue,linktocpage} +\usepackage{hyperref} +\hypersetup{unicode=true,colorlinks,allcolors=blue,linktocpage} \usepackage{hyperxmp} \usepackage{uri} +\usepackage{intopdf} \usepackage{cleveref} \crefname{table}{tableau}{tableaux} 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|: diff --git a/fichiers/scripts/animal.sh b/fichiers/scripts/animal.sh new file mode 100644 index 0000000..668d4ed --- /dev/null +++ b/fichiers/scripts/animal.sh @@ -0,0 +1,16 @@ +#!/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 diff --git a/fichiers/scripts/backup-mk2.sh b/fichiers/scripts/backup-mk2.sh new file mode 100644 index 0000000..61eb824 --- /dev/null +++ b/fichiers/scripts/backup-mk2.sh @@ -0,0 +1,25 @@ +#!/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." diff --git a/fichiers/scripts/backup.sh b/fichiers/scripts/backup.sh new file mode 100644 index 0000000..3f7e109 --- /dev/null +++ b/fichiers/scripts/backup.sh @@ -0,0 +1,19 @@ +#!/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." diff --git a/fichiers/scripts/copyten-mk2.sh b/fichiers/scripts/copyten-mk2.sh new file mode 100644 index 0000000..2d51739 --- /dev/null +++ b/fichiers/scripts/copyten-mk2.sh @@ -0,0 +1,41 @@ +#!/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." diff --git a/fichiers/scripts/copyten.sh b/fichiers/scripts/copyten.sh new file mode 100644 index 0000000..59a7dda --- /dev/null +++ b/fichiers/scripts/copyten.sh @@ -0,0 +1,35 @@ +#!/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." diff --git a/fichiers/scripts/countlines-mk2.sh b/fichiers/scripts/countlines-mk2.sh new file mode 100644 index 0000000..73a87a7 --- /dev/null +++ b/fichiers/scripts/countlines-mk2.sh @@ -0,0 +1,23 @@ +#!/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 diff --git a/fichiers/scripts/countlines.sh b/fichiers/scripts/countlines.sh new file mode 100644 index 0000000..3f7826f --- /dev/null +++ b/fichiers/scripts/countlines.sh @@ -0,0 +1,25 @@ +#!/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 diff --git a/fichiers/scripts/greaterthan.sh b/fichiers/scripts/greaterthan.sh new file mode 100644 index 0000000..e79921e --- /dev/null +++ b/fichiers/scripts/greaterthan.sh @@ -0,0 +1,11 @@ +#!/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 diff --git a/fichiers/scripts/rah.sh b/fichiers/scripts/rah.sh new file mode 100644 index 0000000..9219e0a --- /dev/null +++ b/fichiers/scripts/rah.sh @@ -0,0 +1,13 @@ +#!/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 diff --git a/fichiers/scripts/tiff2png.sh b/fichiers/scripts/tiff2png.sh new file mode 100644 index 0000000..64b97f0 --- /dev/null +++ b/fichiers/scripts/tiff2png.sh @@ -0,0 +1,4 @@ +#!/bin/bash +for file in $(basename -s .tiff $(ls *.tiff)) + do convert "$file".tiff "$file".png +done diff --git a/makefile b/makefile index 7ec9fe0..435f88f 100644 --- a/makefile +++ b/makefile @@ -12,9 +12,8 @@ pdf: clean clean: rm -rf .backup find -iname "*~" | xargs rm -rf - find ./* -type f | grep 'makefile\|\.md$$\|\.png$$\|\.bib$$\|\.tex$$' > ls-R + find ./* -type f | grep 'makefile\|\.md$$\|\.png$$\|\.sh$$\|\.bib$$\|\.tex$$' > ls-R rsync -avPr --files-from=ls-R . .backup -# cp ls-R .backup rm -rf * cp -p -r .backup/* . rm -rf .backup -- cgit v1.2.3