Outils pour utilisateurs

Outils du site


td_-_scripts_bash

Ceci est une ancienne révision du document !


Scripts BASH

L'objectif de ce TD est de vous familiariser avec l'écriture de Scripts bash.

Quelques Rappels

bash est un shell de commandes permettant l'interaction de l'utilisateur avec le système d'exploitation. Ce langage de commandes, outre cette interactivité, permet d'automatiser des tâches. Ainsi, il dispose de certaines caractéristiques des langages de programmation plus « classiques », comme la manipulation de variables - cependant rudimentaire - le conditionnement de blocs d'instruction, la répétition, etc. Quelques éléments de rappel :

  • Un bash-script est un fichier texte/source contenant une succession de commandes bash
  • Toute commande « valide » dans le terminal l'est également au sein d'un bash-script
  • Un passage à la ligne au sein d'un bash-script correspond à la validation dans le terminal
  • un bash-script débute toujours par : #!/bin/bash (c'est le shebang)

Q.1 - Hello World

Ecrire le bash-script correspondant au classique « hello world »

Q.2 - Création de fichiers et redirection de STDOUT

Ecrire un shell-script, créant dans le dossier courant s'il n'existe pas déjà, un répertoire dont le nom est passé en premier argument. Il créera dans ce dossier 10 fichiers nommés « Un » à « Dix » contenant respectivement « file Un » à « file Dix »

Q.3 - Instruction conditionnelle

Ecrire un shell-script admettant 2 nombres en paramètres et affichant le plus grand des deux.

Q.4 - Ai-je un mail ?

Les mails s'accumulent au sein d'un spooler au nom de l'utilisateur. Ainsi, un nouveau mail arrivant pour $USER sera habituellement déposé par le système dans le dossier /var/spool/mail/$USER. Ecrire un bash-script qui vérifie s'il y a du courrier pour un utilisateur dont le nom sera passé en argument.

Voir la section 'conditional expressions' de la BASH refcard

Pour résultat, on affichera sur la sortie standard un des messages suivants :

         Pas de courrier pour <user>.
         Courrier du jour pour <user>.
         Courrier en retard pour <user>.

Q.5 - Boucles et table de multiplications

Ecrire un script nommé table.sh permettant l'affichage des p premières lignes de la table de multiplication d'un nombre n. p et n sont passés en paramètre.

Q.6 - Boucles et calcul d'une série

Ecrire un bash-script qui affiche les valeurs successives de la suite définie par :

La valeur de k est passée en argument de la commande. L'exécution du script se stoppe lorsque le terme est égal à 1.

Q.7 - Trouver le plus petit

Ecrire un bash-script admettant un nombre variable de valeurs entières en paramètre. Elle renvoie sur la sortie standard la plus petite.

Q.8 - Compréhension du metacaractère '*'

On considère la séquence de commandes suivante :

   % mkdir rep
   % cd rep
   % touch echo
   % touch hello
   % *
     hello
   %

Que se produit-il quand on saisit les commandes suivantes ? Expliquez-en la raison.

   % * *

puis

   % * ; *

Q.9 - Premiers usages des tubes

A l'aide de la commande cut, reprenez le bash-script de la question 5 afin qu'il admette indépendamment le paramétrage suivant :

   % ./table.sh p=5 n=6

et

   % ./table.sh n=6 p=5

Dans les deux cas, la sortie standard sera identique.

Q.10 - Compter des lignes

A l'aide de la commande wc, écrire un bash-script nommé sup.sh tel qu'il admette le paramétrage suivant : ./sup.sh rep1 rep2. rep1 et rep2 sont tous deux des dossiers. Ce point, ainsi que le nombre de paramètres doivent être vérifiés par sup.sh. Le traitement réalisé par sup.sh permet de savoir lequel des deux contient le plus grand nombre de références (i.e. dossiers et fichiers). En cas d'égalité, sup.sh affichera le message : dossiers ayant le même nombre d'entrées.

Q.11 - Lister le contenu d'une branche entière

Ecrire un bash-script listebranche qui affiche le contenu de tous les dossiers qui figurent dans le chemin allant de la racine / à votre dossier courant, par exemple:

   $ pwd
   /home/enseign
   $ ./listbranche
   /home/enseign
   joiron lemahec ionica dequen ferment groult ...
   /home
   adminsys master enseign invite licence ...
   /
   bin etc home users ...

Q.12 - Vérification de chemin

Quand une commande (par exemple cd) prend en argument un chemin absolu et que celui-ci n'existe pas, un message comme <chemin> not found sera affiché, sans plus de précision. Ecrire un bash-script nommé check-path.sh qui affiche sur la sortie standard la partie gauche du chemin inexistant, en s'arrêtant sur le répertoire qui n'existe pas. Par exemple :

   $ verif /home/lissence/toto
   /home/lissence n'existe pas

\section{Qui a le plus grand {\tt UID}?}

Une entrée du fichier des utilisateurs « \texttt{/etc/passwd} » a la forme suivante:

\begin{verbatim}

       root:*:0:0:System Administrator:/var/root:/bin/sh

\end{verbatim}

l'\texttt{UID} correspond au nombre situé entre le second et le troisième « : » pour chacun de ces lignes. Quel utilisateur (son \texttt{login}) possède le plus élevé ?

\section{Commande {\tt sort}}

\'Ecrire une commande qui affiche ses arguments en les triant par ordre alphab\'etique.

\section{Commande {\tt lastarg}}

\'Ecrire une commande qui affiche son dernier argument.

\section{Variable {\tt \$PATH}}

\'Ecrire un programme qui recherche les fichiers dont les noms sont pass\'es en argument. Cette recherche est effectu\'ee dans les chemins de la variable d'environnement {\tt \$PATH}. Les chemins contenus dans cette variable sont s\'epar\'es par ':'.

\section{Commande {\tt myDelay}}

\'Ecrire une commande qui ne fait rien jusqu'\`a l'heure juste puis se termine. On n'appellera qu'une seule fois la commande \verb+date+, qui affiche les informations suivant le format :

\begin{verbatim} Thu May 26 08:51:02 MET DST 1994 \end{verbatim}

Dans ce cas, la commande devra se terminer vers \verb+09+ heures, soit 538 secondes apr\`es l'appel \`a date (on n\'eglige le temps d'ex\'ecution de quelques appels \`a des fonctions comme \verb+expr+).

\section{Commande {\tt clean}}

\'Ecrire une commande qui prend en argument le nom d'un r\'epertoire et qui efface tous les fichiers dont le nom se termine par le caract\`ere \verb+~+ contenus dans l'arborescence de ce r\'epertoire. Ne pas utiliser l'option \verb+-r+ de la commande \verb+rm+.

\section{Commande {\tt cptvide}}

\'Ecrire un filtre qui affiche le nombre de lignes vides du flux d'entr\'ee. Une ligne vide est une ligne qui commence par un certain nombre \'eventuellement nul de blancs puis un retour \`a la ligne.

\section{Commande {\tt twice}}

\'Ecrire un filtre qui r\'ep\`ete deux fois chaque ligne de l'entr\'ee standard.

\section{Commande {\tt somtaille}}

\'Ecrire une commande qui affiche la taille totale de tous les fichiers du r\'epertoire courant. On ne consid\`ere que les fichiers simples (pas les sous-r\'epertoires).

\section{Commande {\tt repliq}}

\'Ecrire une commande qui affiche le nom des fichiers du r\'epertoire courant qui n'existent pas dans un des sous-r\'epertoires du r\'epertoire courant (on ne consid\'erera que les sous-r\'epertoires directs du r\'epertoire courant).

\section{Commande {\tt bigger}}

\'Ecrire une commande qui affiche les noms des fichiers du r\'epertoire courant qui ont une taille sup\'erieure ou \'egale au nombre pass\'e en argument. S'il n'y a pas d'argument, la taille minimale par d\'efaut est fix\'ee \`a 1024 octets. La commande \verb+ls -l+ (que vous n'\^etes pas oblig\'es d'utiliser) sort des informations sous le format :

\begin{verbatim} -rw-r–r– 1 lazure 2976 May 26 08:00 unix.interro \end{verbatim}

\section{Commande {\tt mmv}}

\'Ecrire une commande \og multi-move \fg{} qui permet de renommer une s\'erie de fichiers pass\'es en param\`etres. Le nombre de param\`etres sera toujours pair.

Exemple:

\begin{verbatim} %> ls ex1.c ex2.c ex3.c titi toto %> mmv *.c *.c.bak %> ls ex1.c.bak ex2.c.bak ex3.c.bak titi toto %> mmv titi toto tutu tata %> ls ex1.c.bak ex2.c.bak ex3.c.bak tutu tata \end{verbatim}

td_-_scripts_bash.1547738747.txt.gz · Dernière modification : 2019/01/17 15:25 de gilles