Aller au contenu

Administration Unix - TP séance 06

À la fin de la séance, déposez votre fichier de réponses sur la page Ametice en suivant bien les instructions, même si vous n'avez pas fini la planche ; lorsque vous aurez terminé, vous pourrez re-déposer la version finale.

Exercice 1 : la boucle for

a) Recopiez le script suivant sous le nom exo61.sh ; que fait-il ?

#! /bin/bash

for path in /usr /usr/bin ; do
    echo -n "Nombre de fichiers dans le répertoire $path : "
    ls "$path" | wc -l
done

b) Rajoutez dans ce script les répertoires /etc et /sbin.

c) Rajoutez à ce script la fonctionnalité suivante : il doit afficher, à la suite du nombre de fichiers du répertoire, la liste des 10 plus gros fichiers du répertoire, précédés pour chacun de leur taille.

d) Modifiez le script de manière à ce qu'il travaille sur tous les répertoires passés en arguments, par exemple :

$ ./exo61.sh /tmp /sbin

e) Modifiez le script de manière à ce qu'il ignore (en utilisant continue) les arguments qui ne sont pas des répertoires. Par exemple pour

$ ./exo61.sh /tmp /bin/df /sbin

l'argument /bin/df ne devra pas apparaître dans les résultats affichés car il n'est pas un répertoire.

Exercice 2 : la boucle while avec read

a) Recopiez le script suivant sous le nom exo62.sh ; que fait-il ?

#! /bin/bash

res="output.txt"
true >| "$res"
while read line ; do
    echo "$line" | tr a-z A-Z
done >> "$res"

Lors de l'exécution du script, saisissez quelques lignes puis tapez ^D (c'est-à-dire pressez les touches Ctrl+D ).

Pourquoi ^D, qui signifie fin de fichier, stoppe-t-elle la boucle ? (pour vous aider, lire : help read).

b) Modifiez la boucle de manière à ce que les lignes vides ne soient pas recopiées.

c) De plus, modifiez la boucle afin qu'elle s'arrête dès qu'elle tombe sur une ligne contenant la chaîne "stop", sans recopier cette ligne.

d) Pouvez-vous déplacer le tube sur la commande tr en dehors de la boucle en obtenant le même résultat, et si oui, comment ?

Exercice 3 : fonctions et case, génération de scripts

a) Recopiez le script suivant sous le nom exo63.sh puis testez-le :

#! /bin/bash

afficher_usage()
{
    echo "USAGE : $0 -g|-e file"
    echo "  génère ou exécute le script file."
}

# Programme principal
afficher_usage

b) Modifiez le script de manière à appeler la fonction uniquement si le script possède moins de 2 arguments ; de plus, redirigez cet appel de la fonction vers la sortie d'erreurs (sans modifier la fonction elle-même) et faites échouer le script.

c) Rajouter une fonction generer_script qui prend un seul argument. Dans cette fonction, mémoriser cet argument dans la variable locale nom_script.

Ensuite, la fonction écrase le fichier correspondant à nom_script, et écrit dedans les lignes suivantes :

#! /bin/bash
echo "Bonjour ! je suis $0"

Enfin, la fonction rend le fichier exécutable.

À la fin du script, appelez la fonction en lui passant tmp.sh en argument. Que faut-il faire pour que dans le fichier généré tmp.sh il y ait bien les "" et "$0" ? (indice : utiliser des \).

d) Rajouter une fonction executer_script qui prend un seul argument. Dans cette fonction, mémoriser cet argument dans la variable locale nom_script.

La fonction exécute le script correspondant à nom_script, puis affiche si le script a réussi ou échoué.

À la fin du script, testez la fonction avec le fichier tmp.sh généré précédemment.

e) Dans le programme principal, mettez en commentaire les appels aux fonctions generer_script et executer_script.

À la place, écrivez une instruction case sur le premier argument du script :

  • s'il est "-g", appelez generer_script en lui passant l'argument 2 ;
  • s'il est "-e", appelez executer_script en lui passant l'argument 2 ;
  • dans tous les autres cas, appelez afficher_usage redirigé sur la sortie d'erreurs.