Aller au contenu

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.