Correction du TD n°2 : Programmation Shell - Projet DVD-MIAGE 2010
Solutions détaillées aux exercices de programmation shell pour le projet DVD-MIAGE 2010.
Exercice 1 : Création de répertoires avec mkdir
Ce programme crée le répertoire fourni en argument, ainsi que tous les sous-répertoires intermédiaires nécessaires si besoin.
Solution : Utiliser l'option -p de la commande mkdir pour créer automatiquement les répertoires parents.
Exemple : mystere /home/dupont/test/projet
Exercice 2 : Utilisation de la boucle while
Ce script affiche tous les arguments passés en ligne de commande.
Solution :
#!/bin/shif [ $# -eq 0 ]; thenecho "Aucun argument fourni"exit 0fiwhile [ $# -gt 0 ]; doecho "$1"shiftdoneExercice 3 : Redirection avec read
Ce programme lit les lignes d'un fichier et les affiche avec un préfixe.
Solution :
#!/bin/sh# Redirection de l'entrée standard vers le fichier donné en argumentwhile read ligne; doecho ">$ligne"doneExercice 4 : Boucle for sur les répertoires
Ce script affiche le nom de tous les sous-répertoires du répertoire courant.
Solution :
#!/bin/shfor rep in *; do# Pour chaque élément "rep" du répertoire courantif [ -d "$rep" ]; thenecho "$rep"# Affiche le nom du répertoirefidoneExercice 5 : Opérateurs sur les chaînes de caractères
Ce programme vérifie si un utilisateur est connecté au système.
Solution :
#!/bin/shw=$(who | grep "$1")if [ -z "$w" ]; thenecho "$1 n'est pas connecté"fiExercice 6 : Conditionnelles imbriquées
Ce script modifie les permissions du groupe pour tous les fichiers d'une extension donnée, dans un répertoire spécifié.
Solution :
#!/bin/shif [ $# -ne 2 ] && [ $# -ne 3 ]; thenecho "Erreur : donnez 2 ou 3 arguments" >&2exit 1fiif [ $# -eq 2 ]; thenrep="."droit="$1"ext="$2"elif [ $# -eq 3 ]; thenrep="$1"droit="$2"ext="$3"fifor fich in "${rep}"/*.${ext}; dochmod g"$droit" "$fich"echo "$fich"doneExercice 7 : Instruction case pour confirmation
Ce script demande confirmation avant de supprimer un fichier.
Solution :
#!/bin/shwhile [ $# -ne 0 ]; dofich="$1"shiftrepeat=1while [ $repeat -eq 1 ]; doecho "Voulez-vous vraiment effacer le fichier \"$fich\" ?"read reponsecase "$reponse" in[Oo][Uu][Ii]*)rm "$fich"echo "Suppression confirmée"repeat=0;;[Nn][Oo][Nn]*)echo "Suppression abandonnée"repeat=0;;*)echo "Réponse invalide";;esacdonedoneExercice 8 : Utilisation de basename pour renommer des fichiers
Ce script remplace l'extension d'un fichier par une nouvelle extension.
Solution :
#!/bin/shif [ $# -ne 2 ]; thenecho "Erreur : donnez 2 arguments." >&2exit 1fivieux="$1"nouveau="$2"for fich in *."${vieux}"; dobase=$(basename "$fich" ."${vieux}")mv "$fich" "$base.$nouveau"if [ $? -ne 0 ]; thenecho "Je ne peux pas renommer \"$fich\" en \"$base.$nouveau\"." >&2fidoneLa commande basename extrait le nom du fichier sans son ancienne extension. Le nouveau nom est construit en ajoutant la nouvelle extension.
Exercice 9 : Guillemets, quotes ou backquotes
Exemples d'utilisation des différents types de quotes dans un script shell.
Solution 1 :
#!/bin/shecho "Entrez le nom d'un répertoire : "read direcho "Le répertoire $dir contient les fichiers suivants :"ls "$dir"Solution 2 :
#!/bin/shif [ $# -ne 1 ]; thenecho "Erreur : Le script doit être appelé avec 1 argument." >&2exit 1fidir="$1"if [ ! -d "$dir" ]; thenecho "Erreur : \"$dir\" n'est pas un répertoire." >&2exit 1fiif [ ! -r "$dir" ]; thenecho "Erreur : Je ne peux pas lire le répertoire \"$dir\"." >&2exit 1fi# On tente de se déplacer dans le répertoire pour utiliser pwdcd "$dir" 2>/dev/nullif [ $? -ne 0 ]; thencmd="ls \"$dir\""elsedir=$(pwd)cmd="ls"fiecho "Le répertoire \"$dir\" contient les fichiers suivants :"exec $cmdExercice 10 : Expressions régulières avec grep
Utilisation des expressions régulières pour filtrer des lignes.
Solution :
1) Pour rechercher une ligne commençant par un 'a' (minuscule ou majuscule) :
grep -i '^a' fichierou
grep '^[aA]' fichier2) Le symbole '$' représente la fin de la ligne. Pour rechercher des lignes se terminant par 'rs' :
grep 'rs$' fichier