Les TD/TP Avec Corrections Cours Système D'exploitation I: Programme: Filière - SMI  [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

UNIVERISTE MOHAMMED PREMIER Faculté des Sciences d’Oujda Oujda - Maroc

Les TD/TP avec corrections Cours Système d’Exploitation I Programme : Filière – SMI – S3 Pr. El Mostafa DAOUDI Département de Mathématiques et d’Informatique

Année universitaire 2014/2015

Contenu Enoncés TD/TP série N° 2 …………………...……………………............................................................................... 3 TD/TP série N° 3 …………………...………………………………………………………………………... 5 TD/TP série N° 4 …………………...……………………………………………………………………..… 7 TD/TP série N° 5 …………………...……………………………………………………………………….. 9 Corrections TD/TP série N° 3 …………………...……………………............................................................................. 10 TD/TP série N° 4 …………………...………………………………………………………………………. 19 TD/TP série N° 5 …………………...………………………………………………………………………. 28

2

Université Mohammed Premier Faculté des Sciences Département de Mathématiques et d’Informatique

Année universitaire 2014-2015 Filière SMI Module : Système d’Exploitation I Semestre : S3 TD/TP: Série Numéro 2

Exercice1 : 1. Créer à l'aide de la commande « mkdir » un répertoire de nom « rep » dans votre répertoire racine (répertoire de connexion ou « home directory »). 2. Placez-vous dans « rep » et examiner le contenu de ce dernier, en utilisant successivement les commandes « ls », « ls -l », « ls -a ». 3. Le répertoire « rep » contient-il des fichiers ? Si oui, qui sont-ils ? 4. Tapper les commande suivante. % cat . % cd . % pwd Conclure: % rm .. % cd .. % pwd Conclure: 5. A partir du répertoire « rep » : - Exécuter les commandes « ls -ai » et « ls -ali ». Conclure. - Exécuter la commande « cd .. » ensuite « ls -id rep », conclure. - Exécuter ensuite la commande « ls -id ~ » ou « ls -id ~etudiant », conclure. 6. Placez vous dans le répertoire « rep », - En utilisant la commande « cat », créez dans ce répertoire un fichier nommé « fich1.txt » contenant la phrase : « Mon premier fichier sous unix. » - Créer un répertoire « rep1 ». Ensuite se placer dans le répertoire « rep1 » et exécuter les commandes : % ls -ali ~/rep % ls -ali .. % ls -ail ../.. % ls -ali ~ Comparer les résultats 7. Tappez % cd / % pwd % cd .. % pwd Conclure % cd % pwd Conclure 3

% cd / % cd ~ % pwd Conclure 8. Placez−vous dans le répertoire « rep », ensuite exécuter les commandes suivantes : %touch .fich1 %touch fich2 9. Remonter d’un niveau dans l’arborescence (exécuter la commande «% cd ..») puis effectuer les commandes suivantes : % ls -l rep - Effacer les fichiers qui sont listés par la commande « ls ». Que se passe t-il si on exécute la commande. % rmdir rep - Exécuter la commande % ls -la rep Conclure Exercice 2 : 1. Supposons que vous êtes connecté en tant que « etudiant ». A partir du sous-répertoire « rep », lister le contenu du répertoire de connexion de l’utilisateur « smi » en utilisant un chemin absolu (Nom absolu) et un chemin relatif (nom relatif). 2. Revenez à votre répertoire racine et créez un sous-répertoire nommé « Rep-unix ». 3. En utilisant cat, créez dans ce répertoire un fichier « fich1.txt » contenant la phrase : « Mon premier fichier sous unix. » 4. Copiez le fichier « fich1.txt » dans « fich2.txt », ensuite comparer les i-nodes des deux fichiers. 5. Modifiez le nom du fichier « fich2.txt » en « fich3.txt », ensuite afficher les i-nodes des fichiers « fiche1.txt » et « fiche3.tx ». Qu’observez vous au niveau i-nodes ?. 6. Créez un deuxième répertoire « test » dans votre répertoire racine, et un sous-répertoire « sous-test » dans le répertoire « test ». 7. A partir du répertoire racine, - déplacez le fichier « fich3.txt » le répertoire « ~/test/sous-test ». - copiez le fichier « fich3.txt » dans votre répertoire racine. - Supprimez le fichier fich3.txt du répertoire « ~/test/sous-test ». 8. A partir du répertoire « sous-test » - Créez un lien physique nommé « lien_fich1» vers le fichier « fich1.txt » - Comparer les i-nodes des fichiers « lien_fich1 » et « fich1.txt ». - En utilisant la commande « cat », visualisez le contenu du fichier « lien_fich1 ». Qu’observez-vous ? - Modifiez le fichier « fich1.txt » en rajoutant le mot ”fin” à la fin du fichier et visualisez le contenu du fichier « lien_fich1 ». Qu’observez-vous ? - Modifier le contenu du fichier « lien_fich1 » en rajoutant le mot « au revoir » à la fin du fichier et visualiser le contenu de « fich1.txt ». Qu’observez-vous ? Conclure. - Supprimer le fichier « fich1.txt » - Visualiser le contenu de répertoire « sous-test » - Visualiser le contenu du fichier « lien_fich1 ». Qu’observez-vous ? 9. Refaire le même travail avec un lien symbolique et comparer les deux résultats 4

Université Mohammed Premier Faculté des Sciences Département de Mathématiques et d’Informatique

Année universitaire 2014-2015 Filière SMI Module : Système d’Exploitation I Semestre : S3 TD/TP: Série Numéro 3

Exercice1: 1. Que font les commandes suivantes :  ls /etc  ls /etc/*  ls /etc/p*  ls -d /etc 2. Donner la commande qui permet de lister les fichiers et sous- répertoires du répertoire « /etc » qui commencent avec la lettre « p » sans lister le contenu des sous-répertoires trouvés. - sans lister le contenu des sous-répertoires trouvés. L’affichage sera donné avec le masque de protection pour chaque fichier. - en plus elle liste de manière récursive, le contenu des sous-répertoires trouvés. - suivie d’un caractère quelconque, suivi de la lettre « m », suivie de n’importe quelle chaine de caractères, en plus, elle affiche le contenu de chaque sous-répertoire trouvé. - suivie d’un caractère quelconque, suivi de la lettre « m », suivie de n’importe quelle chaine de caractères, suivie de la lettre « a » ou de la lettre « d », sans lister le contenu des sous-répertoires trouvés. - suivie d’un caractère quelconque, suivi de la lettre « m » ou « n » ou « p », suivie de n’importe quelle chaine de caractères. L’affichage sera donné avec plus d’informations sur chaque ficher affiché. - suivie d’un caractère quelconque, suivi de la lettre « m », « n », « o » ou « p », suivie de n’importe quelle chaine de caractères. L’affichage sera donné avec plus d’informations sur chaque ficher affiché. 3. Que font les commandes suivantes :  ls /etc /bin  ls -d /etc /bin/*  ls /etc/p* /bin/b* Exercice2: Quelle est la commande qui permet de lister tous les fichiers de « /usr/bin » dont le nom:        

Commence par « as » ou par « sa ». Commence par « r », « s », « v », ou « z ». Ne commence ni avec « d » ni avec « s ». Comporte au moins un « f ». Comporte au moins deux « f ». Comporte au moins 3 caractères. Comporte exactement 3 caractères. Comporte au plus 3 caractères.

Exercice 3 : 1. Créer dans votre répertoire de connexion, un sous répertoire nommé « D2_tp3 ». Si ce répertoire existe effacer son contenu. 5

2.

A l’aide de l’éditeur de texte « gedit », écrire un programme en langage « C » qui affiche 10 fois la chaine : "Je suis la tache 1". Sauvegarder ce programme, dans le répertoire « D2_tp3 », sous le nom « tache1.c ». 3. Compiler et exécuter ce programme. Pour le fichier exécutable, on lui donne le nom « tache1 ». 4. Quels sont les droits d'accès pour ces deux fichiers. 5. En utilisant le symbole « = », modifier les droits d’accès du fichier « tache1.c » de telle sorte que la lecture, l’écriture et l’exécution soient autorisées pour le propriétaire du fichier, les autres utilisateurs n’auront aucun droit. 6. Enlever, au propriétaire le droit d’exécution et rajouter au groupe et aux autres utilisateurs la possibilité de lire le fichier « tache1.c ». 7. Enlever, au propriétaire du fichier « tache1.c », le droit de lecture et lui rajouter le droit d’exécution, ensuite recompiler le fichier, que se passe-t-il ?. 8. A l’aide de la forme octal, modifier les droits d’accès du fichier exécutable « tache1 » pour avoir les permissions suivantes : « rw-r--r--r ». Que se passe t-il si on exécute le programme ? 9. Enlever, au propriétaire du fichier « tache1.c », le droit d’écriture ensuite modifier le contenu du fichier en remplaçant la chaine "je suis la tache1" par la chaine "tache1 \n". Que se passe-t-il ? 10. tapez la commande « ls -ld /etc ». En se basant sur le résultat obtenu, expliquer ce qui se passe lorsqu’on tape les commandes suivantes  cd /etc  mkdir rep  rm passwd  ls -l passwd  cd  cp /etc/passwd . Exercice 4 : 1. Créer un répertoire nommé « D21 » dans le répertoire « D2_tp3 ». 2. Déplacer le fichier « tache1 » dans le répertoire « D21 » 3. Créer un autre sous-répertoire nommé « table » du répertoire « D2_tp3 ». 4. Copier le fichier « tache1.c » dans le répertoire « D21 » et lui donner le nom « tache3.c » 5. A partir du répertoire « D2_tp3 » lancer la commande « find » qui cherche tous les noms des fichiers qui commencent avec « ta ». 6. Enlever, pour le propriétaire, le droit de lecture sur le répertoire « D21 » et relancer la commande « find ». Que se passe t-il ? 7. Relancer la commande « find » en redirigeant : - les résultats dans le fichier « res.txt » et les erreurs vers le fichier « err.txt » - les résultats et les erreurs vers fichiers « resultats.txt » Exercice5 : 1. Ecrire une commande qui donne: - le nombre de fichiers du répertoire courant - le nombre de répertoires du répertoire courant - le nombre de fichiers ordinaires du répertoire courant 2. Refaire la question 1 pour un répertoire donné 3. Ecrire une commande qui permet d’afficher : - le nombre d’utilisateurs utilisant le « bash » comme shell par défaut - les utilisateurs qui utilisent le « bash » comme shell par défaut. - les utilisateurs qui utilisent le « bash » comme shell par défaut ainsi que leur nombre. - les utilisateurs qui commence avec « e » ou « s » et qui utilise le « bash » comme shell par défaut. 6

Université Mohammed Premier Faculté des Sciences Département de Mathématiques et d’Informatique

Année universitaire 2014-2015 Filière SMI Module : Système d’Exploitation I Semestre : S3 TD/TP: Série Numéro 4

Exercice1 : En utilisant la commande find « lister » tous les fichiers qui ne sont ni des fichiers ordinaires ni des répertoires. Pour les tests, vous créez un répertoire nommé « rep », ensuite à l’aide de la commande « cat » ou « touch », créez deux fichiers nommés « fiche1 » et « fiche2 », enfin vous créez deux liens symboliques nommés « lien_fiche1» vers le fichier « fiche1 » et « lien_fiche2» vers le fichier « fiche2 » Exercice2: A l’aide de la commande grep, lister tous les fichiers du répertoire /etc/X11 dont le nom - Contient la lettre x. - Commence par la lettre x. - Contient la lettre x ou X. - Commence avec la lettre X ou x. - Commence par la lettre X ou x et qui contient un ou plusieurs chiffres. - Commence par la lettre X ou x et qui finit par un chiffre. Exercice3: - Lister tous les fichiers cachés du répertoire de connexion sauf les répertoires. - Lister tous les fichiers ordinaires cachés du répertoire de connexion. Exercice4 : 1. Ecrire une commande qui donne la liste des fichiers du répertoire « /etc » qui commencent avec la lettre « p » et qui sont triés par type. 2. Ecrire une commande qui donne la liste des fichiers du répertoire « /etc » qui commencent avec la lettre « p » triés suivant le nombre de liens (ordre croissant et ordre décroissant). 3. Créer le fichier « resultat.txt » qui a le contenu suivant : Nom Résultat ---------------------------------------------Omar 18 Ali 8 Fatima 15 Mohammed 18 Houcine 16 Zahra 5 Hassane 15 a. Afficher le contenu du fichier « resultat.txt » sauf les deux lignes titres (les deux premières lignes). b. Trier le fichier par ordre alphabétique (les deux lignes titres ne figurent pas sur la sortie). c. Trier le ficher par ordre croissants suivant le champ « Résultat » (les deux lignes titres ne figurent pas sur la sortie). d. Trier le ficher par ordre décroissants suivant le champ « Résultat » (Les deux lignes titres figurent sur la sortie). 7

4. Supposons maintenant que le contenu du fichier « resultat.txt » est comme suit : Nom Résultats ---------------------------------------------Omar 18:10 :12 Ali 8 :19 :0 Fatima 15 :16 :12 Mohammed 18:10:20 Houcine 16:0:10 Zahra 5:13:10 Hassane 15 :16 :12 a. Trier le fichier par ordre croissant suivant le premier résultat b. Trier le fichier par ordre croissants suivant le premier résultat, puis suivant le troisième résultat. c. Afficher avec classement Exercice5 : 1. Donner la commande qui permet d’afficher la liste de tous les utilisateurs. 2. Ecrire un script qui affiche la liste de tous les utilisateurs avec leur numéro de ligne de la façon suivante : par exemple si l’utilisateur « etudiant » se trouve sur la ligne 4, alors il sera affiché comme suit : etudiant:4 Exercice 6 1. Ecrire un script qui affiche ses paramètres dans l’ordre inverse. 2. Ecrire un script qui permet de saisir une série de nombres. La saisie s’arrête quand l’utilisateur tape la valeur 0. Ensuite le script affiche les nombres saisis dans l’ordre inverse. Exercice 7 A l’aide des structure conditionnelle « if » et « case-esac » : 1. Ecrire un script qui affiche un message indiquant les types des fichiers passés en argument au script. 2. Ecrire un script qui affiche un message indiquant les types des fichiers du répertoire courant.

8

Université Mohammed Premier Faculté des Sciences Département de Mathématiques et d’Informatique

Année universitaire 2014-2015 Filière SMI Module : Système d’Exploitation I Semestre : S3 TD: Série Numéro 5

A corriger pendant la séance du cours du Lundi 22 Décembre 2014

Exercice 1 : On reprend les données de l’exercice 4 (série TD-TP N°4), question 4 : Supposons que le contenu du fichier « resultat.txt » est comme suit :

Nom Résultats ---------------------------------------------Omar 18:10 :12 Ali 8 :19 :0 Fatima 15 :16 :12 Mohammed 18:10:20 Houcine 16:0:10 Zahra 5:13:10 Hassane 15 :16 :12 Ecrire un script shell qui permet de rajouter dans le fichier « resultat.txt » une nouvelle colonne qui contient la somme des trois résultats.

Exercice 2 : Ecrire un script shell qui permet de calculer le PGCD de deux entiers positifs passés en argument au script (paramètres positionnels) en utilisant l’algorithme d’Euclide défini de la façon suivante : Soit 0≤b≤a Si b=0 pgcd(a,b) = a Sinon pgcd(a,b)=pgcd(b,r) où r est la division euclidienne entre a et b : a = bq + r avec 0≤rerr # les résultats et les erreurs sont redirigés dans le fichier « err » #expr $a + 0 2>err >res # les résultats sont redirigés vers « res » et les erreurs vers « err » etat=$? # On sauvegarde le statut de la dernière commande dans la varible « etat » if test $etat -lt 2 # $a est un entier then if test $a -eq 0 # si l’entier saisi est un 0 then break # fin de la saisie. On quitte la boucle while else tab[i]=$a # on sauvegarde l’entier saisi dans le tableau tab let i=i+1 fi else # la valeur saisie n’est pas un entier echo " il faut saisir un entier " fi done # on efface les fichiers temporaires rm err 24

#rm err res #affichage des entier dans l’ordre inverse de la saisie echo "Les éléments saisis dans l'ordre inverse" let n=${#tab[@]} for i in ${!tab[@]} do let j=$n-$i-1 echo "${tab[$j]}" done Exercice 7 A l’aide des structure conditionnelle « if » et « case-esac » :

3. Ecrire un script qui affiche un message indiquant les types des fichiers passés en argument au script. Rep1: Structure « if » avec la commande « test »:

#!/bin/bash for fiche in "$@"

# ou for fiche in "$*" ou for fiche in "$@"

ou

for fiche

ou

for fiche

do if test -d "$ fiche " then echo "$fiche est un répertoire" elif test -f "$ fiche " then echo "$ fiche est un fichier ordinaire" elif test -L "$ fiche " then echo "$ fiche est un lien symbolique" else echo "$ fiche est d’un autre type "" fi done Rep2: Structure « if » avec « [ ] » pour les test:

#!/bin/bash for fiche in "$@"

# ou for fiche in "$*" ou for fiche in "$@"

do if [ -d $ fiche ] then echo "$ fiche est un répertoire" elif [ -f $ fiche ] then echo "$ fiche est un fichier ordinaire" elif [ -L $ fiche ] then echo "$ fiche est un lien symbolique" else echo "$ fiche est d’un autre type "" fi done 25

Rep3: Structure « case-esac » :

#!bin/bash for fiche in "$@" # permet de parcourir les paramètres positionnels (les arguments du script) do type_fic=`ls -ld $ fiche | cut -c1` # on récupère dans la variable « type_fic » le type du fichier case $type_fic in -) echo " $fiche est un fichier ordinaire" ;; d) echo " $fiche est un répertoire" ;; l) echo " $fiche est un lien symbolique" ;; *) echo " $fiche est d’un autr type" ;; esac done 4. Ecrire un script qui affiche un message indiquant les types des fichiers du répertoire courant. Rep1 : structure « if » et la boucle « for » Au lieu d’avoir les fichiers à tester comme paramètres positionnels (« for fiche in "$@" » ) on doit faire les tests pour les fichiers du répertoire courant, pour cela on utilise les back quotes pour substituer le résultat de la commande « ls » dans une liste qu’on peut parcourir avec la commande « for » de la manière suivante :

for fiche in `ls`

# ou for fiche in $(ls)

Les reste ne change pas: #!/bin/bash for fiche in `ls` # ou for fiche in $(ls) do if test -d "$fiche" then echo "$fiche est un répertoire" elif test -f "$fiche" then echo "$fiche est un fichier ordinaire" elif test -L "$fiche" then echo "$fiche est un lien symbolique" else echo "$fiche est d’un autre type "" fi done Rep2 : structure « case-esac » et la boucle « for » #!/bin/bash for fiche in `ls` # ou for fiche in $(ls) do type_fic=`ls -ld $fiche | cut -c1` case $type_fic in -) echo " $fiche est un fichier ordinaire" ;; d) echo " $fiche est un répertoire" ;; l) echo " $fiche est un lien symbolique" ;; *) echo " $fiche est d’un autre type" ;; esac done 26

Rep3 : structure « if » et la boucle while #!/bin/bash ls | while read fiche do if test -d "$fiche" then echo "$fiche est un répertoire" elif test -f "$fiche" then echo "$fiche est un fichier ordinaire" elif test -L "$fiche" then echo "$fiche est un lien symbolique" else echo "$fiche est d’un autre type "" fi done Rep4 : structure « case-esac » et la boucle while #!/bin/bash ls | while read fiche do type_fic="ls -ld $fiche | cut -c1" case $type_fic in -) echo " $fiche est un fichier ordinaire" ;; d) echo " $fiche est un répertoire" ;; l) echo " $fiche est un lien symbolique" ;; *) echo " $fiche est d’un autre type" ;; esac done

27

Correction TD/TP: Série Numéro 5 Exercice 1 : On reprend les données de l’exercice 4 (série TD-TP N°4), question 4 : Supposons que le contenu du fichier « resultat.txt » est comme suit :

Nom Résultats ---------------------------------------------Omar 18:10 :12 Ali 8 :19 :0 Fatima 15 :16 :12 Mohammed 18:10:20 Houcine 16:0:10 Zahra 5:13:10 Hassane 15 :16 :12 Ecrire un script shell qui permet de rajouter dans le fichier « resultat.txt » une nouvelle colonne qui contient la somme des trois résultats. Réponse On extrait uniquement les champs résultats et on les sauvegarde dans un fichier nommée « res_plus » et on transforme les « : » avec le symbole « + ». Pour cela : - Tout d’abord, on uniformise les séparateurs de champs en transformant tous les espaces et tabulation en « : » en utilisant la commande : tail -n +3 resultat.txt | tr "$\t" " " | tr -s " " ":" | cut -f2,3,4 -d: | tr ":" "+" > res_plus - Ensuite on sélectionne uniquement les résultats (les champs 2, 3 et 4) en utilisant la commande : cut -f2,3,4 -d: - En fin en transforme les « : » en« + » en on sauvegarde le résultat dans un fichier nommé « res_plus » en utilisant la commande tr ":" "+" > res_plus Finalement la commande est : tail -n +3 resultat.txt | tr "$\t" " " | tr -s " " ":" | cut -f2,3,4 -d: | tr ":" "+" > res_plus On sauvegarde le nombre de lignes du fichier « res_plus » dans la variable « nb » en utilisant la substitution des commandes avec les back quotes. let nb=`wc -l < res_plus` En fin on itère sur les lignes du fichier « res_plus » où chaque ligne du fichier est de la forme « res1+res2+res3 » avec res1, res2 et res3 sont des entiers. Pour évaluer cette expression, il suffit d’appeler la commande « let ». Pour calculer la somme « s » de la ligne « i » du fichier « res_plus » on exécute la commande suivante et on substitue (on utilise les back quotes) le résultat de la commande dans la variable « s » de la manière suivante : let s=`tail -n +$i < res_plus | head -1 ` 28

Pour sauvegarder le résultat de l’évaluation dans un fichier « res_somme » on utilise la commande : echo "$s" >> res_somme Le scripte pour parcourir tous les lignes du fichier « res_somme » let i=1 while [ $i -le $nb ] do let s=`tail -n +$i < res_plus | head -1 ` echo "$s" >> res_somme let i=i+1 done Pour accoler les somme suavegardées dans le fichier « res_somme » vans le fichier « resultat.txt » - Dans le fichier « res » on sauvegarde les données du fichier « resultat » sauf les deux premières lignes, à l’aide de la commande : tail -n +3 resultat.txt > res - On utilse la commande « paste » pour accoler les lignes des fichiers « res » et le fichier « res_somme » ensuite on sauvegarde les résultats dans le fichier « res_final » à l’aide de la commande : paste res res_somme > res_final - Pour visualiser on utilise la commande « cat » cat res_final - On efface les fichiers temporaires : rm res_plus res res_somme

Le script complet : #!/bin/bash tail -n +3 resultat.txt | tr "$\t" " " | tr -s " " ":" | cut -f2,3,4 -d: | tr ":" "+" > res_plus let i=1 let nb=`wc -l < res_plus` while [ $i -le $nb ] do let s=`tail -n +$i < res_plus | head -1 ` echo "$s" >> res_somme let i=i+1 done tail -n +3 resultat.txt > res paste res res_somme > res_final cat res_final rm res_plus res res_somme

Exercice 2 : Ecrire un script shell qui permet de calculer le PGCD de deux entiers positifs passés en argument au script (paramètres positionnels) en utilisant l’algorithme d’Euclide défini de la façon suivante : 29

Soit 0≤b≤a Si b=0 pgcd(a,b) = a Sinon pgcd(a,b)=pgcd(b,r) où r est la division euclidienne entre a et b : a = bq + r avec 0≤rerr # en cas d’erreur, le message d’erreur est redirigé dans le fichier « err » etat=$? # on sauvegarde le statut de la commande « expr » dans la variable « etat ». if test $etat -gt 1 # Si l’argument nb n’est pas entier, alors sortir de la fonction avec le statut 2 then return 2 fi if test $nb -lt 0 # Si l’argument n best négative, alors sortir de la fonction avec le statut 1 then return 1 fi done return 0 } # Fonction calculant le pgcd en utilisant des boucles : pgcd itérative pgcd_iter() { local x=$1 local y=$2 while test $y -ne 0 # while [ $y -ne 0 ] do # pgcd(x, y)=pgcd(y, x mod y) local z=$x x=$y y=`expr $z % $y` done # Affichage du résultat echo "Le PGCD($1,$2) est : $x" return 0 } 30

# Fonction calculant le pgcd en utilisant la récursivité : pgcd récursif pgcd_rec() # pgcd($1,$2) { # test d’arrêt if test $2 -eq 0 # si $2 égal 0 alors pgcd est égal $1 et sort de la fonction avec un statut égal à 1 then echo "$1" return 0 fi # On appliqué la récursivité: pgcd(x, y)=pgcd(y, x mod y) # pgcd_rec ( $2 , `expr $1 % $2` ) pgcd_rec $2 `expr $1 % $2` } # Programme principal # Tests de la numéricité des arguments test_numerique $1 $2 etat=$? # on sauvegarde le statut de la fonction « test_numerique » dans la variable « etat » case $etat in 0) # Arguments valides nb1=$1 nb2=$2 if test $1 -le $2 then nb1=$2 nb2=$1 fi echo "Fonction itérative: " `pgcd_iter $nb1 $nb2` echo "Fonction récursive: Le PGCD($1,$2) est : " `pgcd_rec $nb1 $nb2` ;; 1) # Argument negative echo "L'un des deux paramètres $1 ou $2 est un nombre négatif" ;; 2) # Argument non valide echo "L'un des deux paramètres $1 ou $2 n'est pas un nombre entier" ;; esac

31