Portail informatique Année 2018 – 2019

CSC 3102 – Introduction aux systèmes d’exploitation

Cet exercice a pour but de vous familiariser à la manipulation des structures de base du script shell afin que leur utilisation ne soit pas un frein à la réalisation des séances de TP suivantes.

L'exercice consiste à réaliser une calculette en ligne de commande. Pour cela, nous procédons en plusieurs étapes. Dans la première version de notre calculette, l'objectif est d'appliquer un même opérateur aux opérandes donnés en argument de votre script. Dans une seconde version, votre calculette évoluera afin de permettre l'évaluation d'une suite d'opérandes et d'opérateurs sans priorité.

Avant de commencer, nous vous rappelons que le shell ne manipule que des chaînes de caractères. Ainsi, pour lancer l'évaluation d'une opération arithmétique, vous devez utiliser la commande expr.

Testez régulièrement vos avancées en lançant vos scripts avec différentes configurations d'arguments. Vous pouvez même scripter ces différents appels au sein d'un script shell indépendant afin d'automatiser vos tests. Dans tous les cas, n'oubliez pas de les rendre exécutables grâce à la commande chmod u+x <mon_script.sh>.

Tous les exercices sont obligatoires.

La charge de travail personnel prévisionnelle pour ce DM est estimée à 3h. Le devoir doit être rendu via la section dédiée sur la page moodle du cours. Vous êtes fortement incités à le réaliser en autonomie afin de vous familiariser avec les scripts shell. Vous êtes néanmoins autorisés à le réaliser en binôme (dans ce cas, l'un doit rendre le devoir tandis que l'autre doit rendre un fichier indiquant uniquement le nom du binôme avec qui il a travaillé).

Bon travail ! Dans cette première phase, il s'agit de réaliser un script shell qui permette de réaliser une addition, une soustration, une multiplication ou une division sur l'ensemble des opérandes donnés en ligne de commande. Voici un exemple de résultat d'exécution attendu (les cinq derniers appels doivent être considérés par votre script comme incorrects et génèrer des messages d'erreurs) : $./calculette_uni_operation.sh add 1 2 3 1 + 2 + 3 = 6 $./calculette_uni_operation.sh supp 6 4 6 - 4 = 2 $./calculette_uni_operation.sh mult 2 4 3 2 * 4 * 3 = 24 $./calculette_uni_operation.sh div 66 11 3 3 66 / 11 / 3 / 3 = 0 $ $ $./calculette_uni_operation.sh Opération manquante $./calculette_uni_operation.sh add Opérande manquant $./calculette_uni_operation.sh ad 1 2 3 Opération inconnue $./calculette_uni_operation.sh 1 2 3 Opération inconnue $./calculette_uni_operation.sh div 6 2 0 6 / 2 / 0 : Division par 0 interdite $ Commencez par consulter la page de manuel de la commande expr et testez-la. Supposez que l'appel à votre script est correct et traitez le cas de la somme. Pour vous aider à débuter, voici le pseudo code du script shell attendu. #! /bin/sh # déclaration d'une variable res dans laquelle le résultat sera accumulé, initialisée avec le deuxième argument de la ligne # si le premier argument est égal à "add" alors # décalage de deux arguments puisqu'on a traité l'opérateur et le premier opérande # pour chaque argument suivant # res=res+argument courant # affichage de l'opération effectuée # # affichage du résultat res ne doit pas être égal à la chaîne de caractère <res+argument courant>, mais le résultat de l'évaluation de cette commande.

On vous rappelle donc que, comme vu en cours, vous pouvez affecter une variable à la sortie d'une commande avec la construction bash suivante : var=$(cmd arg1 arg2...) Par exemple, x=$(expr 1 + 2) affectera la valeur 3 à la variable x.
Mettez en place un schéma alternatif afin de traiter les différents opérateurs. Attention à protéger correctement le caractère spécial '*' dans l'évaluation de la multiplication. Traitez le cas de la division par zéro. À présent, traitons les cas d'erreurs. Voici le pseudo code du script attendu : #! /bin/sh #si le nombre d'arguments est égal à 0 # affichage "Opération manquante" # sortie du script #sinon # si le nombre d'arguments est égal à 1 # affichage "Opérande manquant" # sortie du script # sinon # res=deuxième argument de la ligne # affichage # si le premier argument est égal à # "add" : # décalage de deux arguments puisqu'on a traité l'opérateur et le premier opérande # pour chaque argument suivant # res=res+argument courant # affichage de l'opération effectuée # "supp" : # ... # "mult" : # ... # "div" : # si operande = 0 # affichage " / 0 : Division par 0 interdite" # sinon # ... # autre cas : # affichage "Operation non traitée" # sortie du script # affichage du resultat
À présent, nous vous proposons de réaliser une calculette qui permet d'appliquer les opérations arithmétiques dans l'ordre où elles sont écrites, i.e. sans tenir compte des priorités sur les opérateurs. Voici un exemple de résultat d'exécution attendu : $./calculette_sans_priorite.sh 1 + 2 + 3 1 + 2 + 3 = 6 $./calculette_sans_priorité.sh 6 - 4 6 - 4 = 2 $./calculette_sans_priorité.sh 2 x 4 + 3 2 * 4 + 3 = 11 $./calculette_sans_priorite.sh 3 + 2 x 4 3 + 2 * 4 = 20 $./calculette_sans_priorite.sh 3 + 2 x 4 / 2 3 + 2 * 4 / 2 = 10 $ $ $./calculette_sans_priorite.sh Opérande manquant $./calculette_sans_priorite.sh 1 +2 1 +2 -> Opération non traitée $./calculette_sans_priorite.sh 1 / 0 1 /0 -> Division par 0 interdite $

  • Afin de pas à se soucier de l'interprétation du symbole '*' en tant qu'opérateur de multiplication de notre script shell, utilisez le caractère "x" à la place.
  • Attention à bien séparer vos arguments par des espaces.
Dans un nouveau script shell, abordez le problème sans vous soucier des cas d'erreurs. Pour vous aider, voici le pseudo code du script shell attendu : #! /bin/sh # #res=premier argument #affichage #décalage # #tant qu'il reste des arguments # si l'argument courant est égal à # + : # res=res+ argument qui suit # affichage # - : # ... # x : # ... # / : # si argument qui suit = 0, affichage "Divivion par 0 interdite" # # décalage #affichage du résultat Traitez les cas d'erreurs.
En vous basant sur le script précédent, faites en sorte de prendre en compte les priorités qu'imposent les opérateurs arithmétiques, et ce, sans parenthèse.

La multiplication et la division sont prioritaires sur l'addition et la soustraction; que ce soit dans une suite d'additions et de soustractions ou dans une suite de multiplications et de divisions, on effectue les calculs dans l'ordre d'écriture (c'est-à-dire de manière similaire à la question précédente). Ainsi, le challenge réside dans la différenciation des opérations selon leur priorité.

Pour vous aider, à chaque fois que vous rencontrez un opérateur non prioritaire, il faut que vous détectiez si l'opération suivante doit être évaluée avant. Plusieurs opérations prioritaires pouvant se suivre, cette vérification + évaluation doit être faite au sein d'une boucle qui prend fin lorsque l'opérateur rencontré n'est ni un opérateur de multiplication ni un opérateur de division.