Obtenir le pack complet des cours, TDs, examens sur Systèmes d’Exploitation!
Vous souhaitez maîtriser Systèmes d’Exploitation ? Ne cherchez plus, nous avons le pack bien choisi pour vous.
Accédez à une collection complète des supports de cours, des travaux dirigés (TDs) corrigés, TPs avec solution, examens...
Télécharger packProjet DVD-MIAGE 2010
TD n°2 : Programmation shell
CORRECTION
Exercice 1
– Exemple de programme shell Solution :
1) Ce programme crée le répertoire fourni en argument, et au besoin tous les sur-répertoires intermédiaires nécessaires. Note : voir l'option '-p' de mkdir.
2) mystere /home/dupont/test/projet
Exercice 2
– La boucle while
Solution :
#!/bin/sh
if [ $# -eq 0 ]; then
echo "sans argument"
exit 0fi while [ $# -gt 0 ]; do
echo $1shift done
Exercice 3
– La commande read
Solution :
#!/bin/sh
exec $1
# redirection de l'entrée standard
while read ligne ; do
echo ">$ligne"done
Exercice 4
– La boucle for
Solution :
#!/bin/sh
for rep in *; do
# pour chaque fichier "rep" du repertoire courant
if [ -d "$rep" ]; then # si rep est un repertoire
echo $rep
# affiche repfi done
Systèmes d'exploitationA. Queudet
Projet DVD-MIAGE 2010
Exercice 5
– Opérateurs sur les chaînes
Solution : Ce programme détermine si l'utilisateur dont le nom est donné comme argument est connecté. #!/bin/sh
w=`who | grep $1`
if [ -z "$w" ]; then echo "$1 n'est pas connecté"; fi
Exercice 6
– Les conditionnelles imbriquées
Solution :
#!/bin/sh
if [ $# -eq 2 ]; then
# si le nombre d'arguments est égal à 2 :
rep="."
# variable rep vaut le repertoire courant = "."
droit=$1
# variable droit vaut le premier argument $1ext=$2 # variable ext vaut le deuxieme argument $2
elif [ $# -eq 3 ]; then
# si le nombre d'arguments est égal à 3 :rep=$1 # variable rep vaut le premier argument $1
droit=$2
# variable droit vaut le deuxieme argument $2ext=$3 # variable ext vaut le troisieme argument $3else echo "erreur : donnez 2 ou 3 arguments" 1>&2
exit 1fi for fich in "${rep}"/*"${ext}"; do # pour chaque fichier "fich" dans rep/*ext:
chmod g$droit "$fich"
# changer le droit du groupe "g" sur "fich"
echo $fichdone
Exercice 7
– L'instruction case
A noter que l'option -i de la commande rm fait exactement ce que nous voulons. Solution :
#!/bin/sh
while [ $# -ne 0 ]; do
fich=$1; shift
## ou : for fich in $*; do
repeat=1
while [ $repeat -eq 1 ]; do
echo "Voulez-vous reellement effacer le fichier \"$fich\" ?"
read reponse
case "$reponse" in
[Oo][Uu][Ii])
rm "$fich"
echo "suppression confirmée"
Systèmes d'exploitationA. Queudet
Projet DVD-MIAGE 2010
repeat=0;; [Nn][Oo][Nn])
echo "suppression abondonnée"
repeat=0;; *)
echo "reponse invalide";; esacdone done
Exercice 8
– La commande basename
Solution :
#!/bin/sh
if [ $# -ne 2 ]; then
echo "erreur : donnez 2 arguments." 1>&2
exit 1 fi
vieux=$1
nouveau=$2
for fich in *"${vieux}"; do
base=`basename "$fich" "$vieux"`
mv "$fich" "$base$nouveau"
if [ $? -ne 0 ]; then
echo "je ne peux pas renommer \"$fich\" en \"$base$nouveau\"" 1>&2fi done
La commande basename est ici utilisée pour récupérer dans la variable base le nom du fichier sans son extension représentée par la variable $vieux. Le nouveau nom du fichier (avec sa nouvelle extension) est donc facile à reconstruire : c'est le nom du fichier base, suivi de la nouvelle extension $nouveau.
Exercice 9
– Guillemets, quotes ou back quotes ?
Solution :1) #!/bin/sh
echo "Entrer le nom d'un répertoire : "
read dir
echo "Le répertoire $dir contient les fichiers suivants :"
ls "$dir"2) #!/bin/sh
Systèmes d'exploitationA. Queudet
Projet DVD-MIAGE 2010
echo "Entrer le nom d'un répertoire : "
read dir
if [ $# -ne 0 ]; then
echo "Erreur : Le script doit être appelé avec 1 argument" 1>&2
exit 1fi if [ ! -d "$dir" ]; then
echo "Erreur : \"$dir\" n'est pas un répertoire" 1>&2
exit 1fi if [ ! -r "$dir" ]; then
echo "Erreur : je ne peux pas lire le répertoire \"$dir\"" 1>&2
exit 1fi # On essaye d'aller dans le répertoire $dir pour utiliser
# pwd pour déterminer son nom absolu
cd "$dir" 2> /dev/null
if [ $? -ne 0 ]; then
# on garde alors le nom donné
cmd="ls \"$dir\""else dir=`pwd`
cmd="ls"fi echo "Le répertoire \"$dir\" contient les fichiers suivants :"
exec $cmd
Exercice 10
– Les expressions régulières
Solution :
1) Il faut indiquer que l'on veut le début de la ligne, avec le chapeau. Afin de préciser que la ligne commence par un 'a' minuscule ou majuscule, il y a deux façons de faire : •Utiliser l'option -i qui fait ignorer la différence entre les majuscules et le minuscules.
•Dire que l'on cherche un 'a' ou un 'A' en utilisant les crochets.
Enfin, il faut protéger les signes contre le shell, pour qu'il ne les interprète pas; on met donc l'expression entre apostrophes.
Il faut donc écrire : grep -i '^a' fichier
ou grep '^[aA]' fichier
2) C'est le dollar ($) qui représente la fin de la ligne. Il faut donc écrire : grep 'rs
