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"
, appelezgenerer_script
en lui passant l'argument 2 ; - s'il est
"-e"
, appelezexecuter_script
en lui passant l'argument 2 ; - dans tous les autres cas, appelez
afficher_usage
redirigé sur la sortie d'erreurs.