Administration Unix - TP séance 07
À 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 : fonctions, opérateurs de variables sur les chemins
Placer les fonctions suivantes dans un script exo71.sh
et les appeler sur
des exemples à la fin du script.
a) Que fait la fonction suivante ?
enlever_chemin() # fichier
{
local fichier=$1
echo "${fichier##*/}"
}
Testez la fonction en l'appelant avec différents arguments, par exemple
"aa/bb/cc.dd.ee"
.
b) En vous inspirant de la fonction précédente, rajoutez dans le script
une fonction enlever_extensions
, qui prend en argument un nom de fichier
avec son chemin éventuel, puis l'affiche en enlevant toutes les extensions
(pour l'exemple ci-dessus on obtiendra "aa/bb/cc"
).
c) Rajoutez une fonction obtenir_base_nom
, qui prend en argument un nom de
fichier avec son chemin éventuel, puis affiche le nom obtenu en enlevant le
chemin et toutes les extensions.
(pour l'exemple ci-dessus on obtiendra "cc"
).
d) Rajoutez deux fonctions, qui prennent chacune en argument un nom de fichier avec son chemin éventuel :
- la fonction
enlever_derniere_extension
affiche le nom obtenu en enlevant la dernière extension (dans notre exemple on obtient"aa/bb/cc.dd"
) ; - la fonction
obtenir_derniere_extension
affiche la dernière extension sans le point (dans notre exemple on obtient"ee"
).
Exercice 2 : boucles, substitution de commandes, expansion arithmétique
Placer les fonctions suivantes dans un script exo72.sh
et les appeler sur
des exemples à la fin du script.
a) Écrivez une fonction calculer_entier_suivant
, qui prend en argument
un entier. La fonction calcule 1 + l'entier, puis affiche le résultat.
b) Écrivez une fonction calculer_maximum
, qui prend en argument deux entiers.
La fonction affiche le plus grand des deux entiers.
c) Écrivez une fonction calculer_maximum_liste
, qui prend en arguments des
entiers. La fonction cherche puis affiche le plus grand des entiers, en
appelant au besoin la fonction précédente. Dans le cas où la liste est
vide (c'est-à-dire s'il n'y a pas d'argument), la fonction affiche 0.
d) Écrivez une fonction calculer_suivant_liste
, qui prend en arguments des
entiers. La fonction affiche la valeur de 1 + le plus grand des entiers,
en appelant au besoin les fonctions précédentes. Dans le cas où la liste est vide
(c'est-à-dire s'il n'y a pas d'argument), la fonction affiche 1.
Exercice 3 : sauvegarde numérotée
Placer les fonctions suivantes dans un script exo73.sh
et les appeler sur
des exemples à la fin du script. Recopier dans le script les fonctions des
exercices précédents si besoin.
a) Que fait la fonction suivante ?
est_entier() # nombre
{
local nombre=$1
expr "$nombre" + 1 > /dev/null 2>&1
}
Testez par exemple pour "5"
, "3.14"
, "toto"
, ""
; observez chaque fois $?
.
b) Rajoutez une fonction lister_entiers
, qui prend en arguments des mots
quelconques, puis affiche uniquement ceux qui sont des nombres entiers.
c) Rajoutez une fonction lister_extensions
, qui prend en argument un nom de
fichier avec son chemin éventuel, et affiche la liste des extensions
existantes de ce fichier.
Par exemple, considérons les fichiers créés par
$ touch /tmp/essai-{foo,bar.sh}{.tar.gz,,.{1..7..2},.old1}
$ ls /tmp/essai-*
L'appel de la fonction pour l'argument "/tmp/essai-bar.sh"
affichera
(sur la même ligne ou des lignes séparées) : '' 1 3 5 7 old1 tar.gz
Algorithme : parcourez à l'aide d'une boucle for
la liste des fichiers
existants en rajoutant une extension (motif .*
) au fichier initial, et pour
chacun, enlevez au début le nom du fichier initial et un "."
, et affichez
le résultat.
d) Rajoutez une fonction calculer_numero_copie
, qui prend en argument un
nom de fichier avec son chemin éventuel.
La fonction examine les extensions existantes du fichier avec la fonction
lister_extensions
, puis sélectionne celles qui ont une valeur entière à
l'aide de lister_entiers
, puis affiche (le plus grand des entiers) + 1
à l'aide de calculer_suivant_liste
.
Dans l'exemple de la question c), la liste des entiers est 1 3 5 7
,
et donc la fonction affichera 8
.
e) Rajoutez une fonction sauvegarder_copie_numerotee
, qui prend en argument un
nom de fichier avec son chemin éventuel.
La fonction calcule le numéro de copie du fichier en faisant appel à
calculer_numero_copie
. La fonction effectue ensuite une copie du fichier
en lui rajoutant en extension le numéro de copie que l'on vient de
calculer. Elle affiche de plus un message avec le nom de la copie.
Dans l'exemple de la question d), on avait obtenu 8
, donc la fonction
créera une copie de "/tmp/essai-bar.sh"
sous le nom "/tmp/essai-bar.sh.8"
.
f) Dans le programme principal du script (c'est-à-dire à la fin du script après les déclarations de fonctions), mettez tous les tests en commentaire, puis rajoutez ce pseudo-code en le traduisant en bash :
Pour chaque argument du script,
- si cet argument n'est pas un fichier régulier alors affichez un message d'erreur sur la sortie d'erreur, puis appelez
continue
;- appelez
sauvegarder_copie_numerotee
pour cet argument.
Testez enfin la robustesse de votre script en lui passant en argument des fichiers et des sous-répertoires dont le nom contient des espaces.