TP Bash

Quelques conseils propres à ce TP :

  • respectez scrupuleusement la syntaxe, soyez vigilant à la signification particulière des caractères spéciaux, en particulier l’espace source intarissable d’erreurs,
  • testez les fonctionnalités de vos scripts une à une dans le terminal, de façon isolée, et non pas directement intégrées dans un programme,
  • utilisez des commandes “neutres” pour tester certaines fonctionnalités critiques (par exemple, remplacez systématiquement la commande rm par la commande ls).

Chaque exercice correspond à un script dont vous devez respectez le nom et indique les commandes qui peuvent être utilisées pour le résoudre.


Premiers scripts

Dans un premier temps, il n’est pas demandé de vérifier l’adéquation des données avec les objectifs des scripts.

1. Chiffrement de César (tr)

Écrire le script cesar qui réalise le chiffrement de César (décalage des lettres de l’alphabet) en utilisant la commande tr.

Le script prendra comme premier paramètre le nom du fichier à coder et comme deuxième paramètre le nom du fichier codé. On utilisera un décalage de 5 lettres (i.e a=f, b=g, c=h, …).

Écrire un deuxième script rasec réalisant l’opération de décodage d’un fichier chiffré par César.

2. Liste des répertoires (tr, wc)

À partir de la variable d’environnement PATH, écrire le script liste_rep qui renvoie le nombre de répertoires stockés dans cette variable, ainsi que la liste de ces derniers.

3. Liste des fichiers sauf … (comm, sort, tr)

En utilisant la commande comm, écrire le script liste_fic_sauf qui permet de lister tous les fichiers du répertoire courant sauf ceux spécifiés comme paramètres du script (on pourra éventuellement utiliser des caractères jokers en paramètres).

Remarque : par défaut la commande ls renvoie la liste des fichiers dans l’ordre alphabétique.

4. Quel shell (grep)

À partir du fichier /etc/passwd, écrire le script quel_shell qui prend en paramètre le nom d’un shell (bash par exemple) et qui renvoie le nombre d’utilisateurs utilisant ce shell.

5. Utilisateurs et login (cut, grep)

À partir du fichier /etc/passwd, écrire le script commence_par qui prend en paramètre une lettre et affiche sur la sortie standard :

  • le nombre d’utilisateurs dont le nom de famille commence par cette lettre,
  • la liste alphabétique de tous les logins correspondant au nom commençant par cette lettre.

6. Indice (cut, grep, tr)

Écrire le script indice qui accepte un nombre n quelconque de paramètres et renvoie l’indice de la position du premier paramètre dans la liste constituée des éléments 2 à n. Le script ne renvoie rien si le premier paramètre n’apparait pas dans la liste.

Exemple : indice rouge bleu jaune rouge vert doit renvoyer 3.

7. UID, GID, group (cut, grep, tr)

À partir des fichiers /etc/passwd et /etc/group, écrire le script ident_infos qui prend en paramètre un nom de login et renvoie sur une même ligne, l’UID, le GID correspondant au login ainsi que le nom du groupe.

8. Occupation disque (cut, df, grep, tr)

La commande df -h renvoie le pourcentage d’occupation de chaque partition.

Ecrire le script occupation qui prend en paramètre le nom d’un répertoire correspondant à une partition et qui renvoie son pourcentage d’occupation.

Exemple : ./occupation / renvoie 56 %.


Structures conditionnelles

Dans les trois exercices qui suivent, vous devez vérifier d’adéquation des paramètres avec ce qui est attendu par chaque script.

9. /usr/bin (grep, if, tr)

Écrire le script qui_est_gros tel que qui_est_gros n renvoie la liste des noms des n plus gros exécutables de /usr/bin.

10. Groupe (cut, grep)

À partir du fichier /etc/group, écrire le script groupe qui accepte un paramètre : si ce paramètre est un entier, le script renvoie le nom du groupe correspondant, si c’est un nom, il renvoie le numéro du groupe correspondant.

Exemple : ./nom_groupe 2999 renvoie STAFF. Exemple : ./nom_groupe STAFF renvoie 2999.

11. Taux d’occupation (cut, df, grep, tr)

Écrire le script alerte qui prend en paramètre un nom de partition et un pourcentage et qui renvoie un message si le taux d’occupation de la partition est supérieur ou égal au pourcentage spécifié.

Le message à afficher est donné dans l’exemple ci-dessous, respectez le scrupuleusement (notamment au niveau de la ponctuation utilisée).

Exemple : ./alerte /boot 50 renvoie Attention la partition /boot est occupee a plus de 50 % !!


Structures répétitives

12. Recherche de commandes (for, grep, tr)

Écrire le script cherche_cmd qui prend en paramètre une chaîne de caractères. Le script renvoie la liste des commandes dont le nom contient cette chaîne, les commandes étant recherchées dans les répertoires spécifiés dans la variable d’environnement PATH.

13. Inventaire (for, if)

Écrire le script nb_fic_rep qui compte le nombre de fichiers et de répertoires : - du répertoire courant si aucun paramètre n’est spécifié, - du répertoire dont le nom est passé en paramètre, on s’assurera alors que le répertoire existe bien.

14. Recherche approfondie (for, grep, if)

Écrire le script ggrep (global grep) qui prend en paramètre une chaîne de caractères et un nom de répertoire.

Le script effectue alors une recherche récursive (à partir du répertoire mentionné) des fichiers qui contiennent la chaîne spécifiée (consultez les options de grep pour n’afficher que le nom du fichier et pour ne pas avoir d’erreurs si vous n’avez pas la permission de lecture sur un fichier).

15. Scripts exécutables (file, for, grep, if)

Écrire le script bash_exec qui prend en paramètre un nom de répertoire et qui ajoute de façon récursive le droit d’exécution à tout script bash stocké dans ce répertoire ou dans l’un de ses sous-répertoires.

Réaliser ce script sans utiliser la commande find.

16. Indice, le retour (cut, while)

Réécrire le script indice permettant de renvoyer l’indice de la place occupée par un mot dans une liste. Cette fois-ci, si le paramètre ne fait pas partie de la liste, la valeur renvoyée sera -1.

On n’utilisera pas la commande grep pour cette version.


Challenges

17. Exécutable (case, for, if, read)

Ecrire le script fic_exec permettant de rendre un fichier exécutable pour son propriétaire. Ce script prendra comme paramètre le nom du fichier concerné.
Modifier le script précédent de façon à ce que :
  • fic_exec <nom fichier> rende exécutable le fichier,
  • fic_exec -i <nom fichier> demande confirmation à l’utilisateur avant de rendre exécutable le fichier,
  • en l’absence de paramètre, un message d’alerte doit être renvoyé à l’utilisateur.
Reprendre l’exercice précédent et le modifier de façon à ce qu’on puisse spécifier sur la ligne de commande une liste de fichiers.

18.