ajout des tp 7-8 en systeme et modif du 8 en algo

master
antoine.perederii 2 years ago
parent 609652bc83
commit 1db7f10609

@ -7,3 +7,4 @@ void initialiser(char mot[], int n);
void placer(char mot1[], char c, char mot2[]); void placer(char mot1[], char c, char mot2[]);
void jeuPendu(void); void jeuPendu(void);
int compterLettres(char mot[]); int compterLettres(char mot[]);
void chargement(int tMot);

@ -0,0 +1,12 @@
#!/bin/sh
val='a'
until [ "$val" = "q" ] ; do
echo -n "Donnez une commande (<q> pour quitter) : "
read "val"
if [ "$val" = "q" ]; then
exit 0
fi
echo "$($val)"
done

@ -0,0 +1,29 @@
#!/bin/sh
val=0
while [ "$val" -ne "9" ] ; do
if [ "$val" = "1" ] ; then
echo ""
echo "$(date)"
elif [ "$val" = "2" ] ; then
echo ""
echo "Il y a $(who -a | wc -l) personnes connéctées sur ta session."
elif [ "$val" = "3" ] ; then #les "" et = permettent d'eviter les pb si l'utilisateur tape une chaine de carac
echo ""
echo "$(ps -elf)"
elif [ "$val" != "9" ]; then
echo "C'est quoi ce chiffre ??!! Je ne connais pas !!" >&2
fi
echo""
echo "Menu général"
echo "******************************"
echo ""
echo "<1> Afficher la date (date)"
echo "<2> Afficher le nombre de personnes connéctées (who)"
echo "<3> Afficher la liste des processus (ps)"
echo "<9> Quitter"
echo ""
read val
done

@ -0,0 +1,70 @@
# TP 7 - Scripts
Pas de compte rendu dédié aux TP sur les scripts shell. Vos programmes
feront foi !
<note tip>
Quelques règles simples pour éviter les erreurs de syntaxe :
* jamais d'espace autour d'une affectation (exemple : `a=3`)
* des espaces partout ailleurs (exemple `if` `test` `$a`
`=` `4;` `then...` ou `if` `[` `$a` `=`
`4` `]` `;` `then...`
Pour observer les commandes exécutées, passez en mode trace en plaçant
la commande `set -x` en début de programme.
</note>
#### 6 - La commande menu1
En utilisant la structure `while`, écrire un script qui :
Tant que l'utilisateur n'a pas tapé 9
* affiche un menu
* demande à l'utilisateur de saisir une option du menu
* affiche à l'utilisateur le résultat de sa commande
Exemple de ce qui doit s'afficher à l'écran :
```
Menu général
***************************************
<1> Afficher la date (date)
<2> Afficher le nombre de personnes connectées (who)
<3> Afficher la liste des processus (ps)
<9> Quitter
```
#### 7 - La commande evaluateur
En utilisant la structure *until...do...done*, écrire un script qui :
* demande à un utilisateur de saisir une commande
* exécute la commande ou affiche un message d'erreur si la commande ne s'est pas correctement exécutée.
* répète cette opération tant que l'utilisateur le désire
Indication : si vous disposez d'une variable contenant une ligne de
commandes il est possible de l'exécuter via la fonction interne au shell
`eval`. Le code de retour retourné par eval est le code de retour
retourné par la commande. Exemple : `c="ls -l | wc -l"` `eval $c`
Voici un exemple de ce que votre programme doit afficher à l'écran :
```
Saisissez une commande, commande <q> pour quitter.
> date
mar sep 30 21:20:45 CEST 2008
Saisissez une commande, commande <q> pour quitter.
> cd /toto
bash: cd: /toto: Aucun fichier ou répertoire de ce type
cette commande a généré une erreur !!!!
Saisissez une commande, commande <q> pour quitter.
> q
```

@ -0,0 +1,16 @@
#!/bin/sh
while [ $# -ne 0 ]; do
case "$1" in
'-v')
echo 'Mode verbose'
shift
;;
'-m'|'-M')
machine="$2"
shift 2 || sortie "Manque valeur"
;;
*) sortie "Argument $1 inconnu"
;;
esac
done

@ -0,0 +1,24 @@
#!/bin/sh
L=
while [ $# -ne 0 ]; do
case "$1" in
'-lang')
if [ "$2" = "fr" ]; then
date +%d/%m/%y
elif [ "$2" = "en" ] ; then
date +%m/%d/%y
date ++dd/mm/yy
shift
;;
'-fullYear')
date +Y
shift
;;
*)
echo "Argument $1 inconnu"
shift
;;
esac
done

@ -0,0 +1,219 @@
# Système utilisateur TP n°8
Pas de compte rendu dédié aux TP sur les scripts shell. Vos programmes feront foi \!
## Variables et environnement d'exécution
- Vérifiez si la variable `PATH` contient le répertoire courant. Sinon ajoutez-le.
- Créez et affectez une variable de "jour" (pour aujourd'hui).
- Créez, affectez et exportez une variable "mois".
- Créez un fichier `variables.sh ` avec `vi` contenant les lignes suivantes:
- Lindication que le shell utilisé doit être `bash`: `#!/bin/bash`
- La création et laffectation dune variable `annee` ;
- Laffichage des contenus des trois variables : `jour`, `mois` et `annee`.
- Fixez les droits `rw-` pour le fichier `variables.sh`.
Exécutez les commandes suivantes et **commentez le résultat obtenu**.
- Exécutez la commande `sh variables.sh`.
- Exécutez la commande `echo $mois, $annee`.
- Exécutez la commande `source variables.sh`.
- Exécutez la commande `echo $jour, $mois, $annee`.
- Supprimez la variable `annee`.
- Ajoutez le droit dexécution pour le fichier `variables.sh`.
- Exécutez la commande `variables.sh`.
- Exécutez la commande `echo $jour, $mois, $annee`.
## La commande option
Écrire un programme capable d'afficher la date et l'heure suivant différents formats en fonction des options qui lui sont passées :
L'option `-lang lang` permet de choisir un affichage *jj mm aa* lorsqu'elle vaut *fr* » ou un affichage *mm jj aa* si elle vaut *en*.
L'option `-fullYear` force l'affichage de l'année sur 4 chiffres au lieu de deux.
L'option `-addTime` permet d'ajouter l'heure à l'affichage.
La commande retournera un message d'erreur et un code retour de 1 si la syntaxe des options est incorrecte.
0 sinon.
### Note
Pour éviter que votre programme ne soit une "usine à gaz", décomposez le en trois parties :
- Associer une variable à la valeur par défaut de chacune des options.
- Traiter les arguments et modifier la valeur des variables.
- Effectuer le traitement en fonction de la valeur des variables.
Remarque : il est possible de préciser un format d'affichage à la commande `date` (exemple : `date +%M:%S`)
## La commande `waitfor`
Le programme `waitfor -user ident` doit, en scrutant chaque seconde la liste des processus, détecter la connexion de l'utilisateur dont le login est indiqué par l'option `-user`.
Une fois détectée, le programme se termine avec un message d'information.
## Exercice sur les fonctions
Il est courant d'avoir à compter des d'objets d'un certain type (processus, fichiers, ...) et de produire un tableau synthétique de la forme : `objetDeType1 nombre1` `objetDeType2 nombre2` `...` Un exemple classique est de compter le nombre de processus pour chaque utilisateur du système. Exemple :
```
$ ./compteProcessus
avahi 2
clamav 1
daemon 2
dansguardian 11
davalan 87
Debian-exim 1
haldaemon 2
messagebus 1
ntp 1
proxy 2
root 136
statd 1
uml-net 1
www-data 1
```
Le résultat ci-dessus a été produit par le script suivant qu'il vous faudra compléter.
```bash
#!/bin/bash
doc() {
cat << EOF >&2
Affiche le nombre de processus de chaque utilisateur possédant au moins
1 processus dans le système.
usage : \`basename $0\` \[ -h \]
-h : affiche cette aide.
EOF
}
usage() {
doc
exit 1
}
# 1. Compte le nombre de processus de l'utilisateur dont le login est passé en argument.
# 2. $1 : le login.
# 3. stdout : le nombre de processus de l'utilisateur.
processOneUser() {
# Les remarques indiquées dans la fonction processAllUsers
# s'appliquent également à cette fonction
### A COMPLETER (1 ligne) ###
}
# 1. Affiche le tableau (non trié) du nombre de processus par utilisateur.
# 2. Pas d'argument.
# 3. stdout : le tableau.
processAllUsers() {
# traitement
# ----------
# début
# L<-liste des utilisateurs possédant un processus en mémoire
# pour i élément de L faire
# n=nombre de processus de l'utilisateur i dans le système
# afficher "i n"
# fin pour
# fin
# Remarques :
# 1. pour obtenir la liste des propriétaire des processus, utilisez la
# commande : ps h -eo user
# 2. Pour éliminer les doublons d'une liste filtrez la avec la commande :
# sort -u.
### A COMPLETER (5 lignes) ###
}
# Début du traitement des arguments.
while [ $# -ne 0 ]; do
case $1 in
-h|--help)
doc
exit 0
;;
*) usage
;;
esac
shift
done
# Fin du traitement des arguments.
processAllUsers
```
* Complétez le script.
* Ajoutez un filtre permettant de trier les lignes affichées par ordre décroissant de nombre de processus (étudiez les différentes options de `sort`). Le résultat attendu sera de la forme :
```
root 137
davalan 90
dansguardian 11
proxy 2
haldaemon 2
daemon 2
avahi 2
www-data 1
uml-net 1
statd 1
sshd 1
ntp 1
messagebus 1
Debian-exim 1
clamav 1
```
* Ajouter une fonction `toHtml` à vos scripts pour modifier la sortie afin de produire un document HTML contenant une table. Voici ci-dessous un exemple de résultat attendu se basant sur l'exemple 1.1 :
```html
<html>
<body>
<table border="1">
<tr><td>root</td><td>136</td></tr>
<tr><td>davalan</td><td>91</td></tr>
<tr><td>dansguardian</td><td>11</td></tr>
<tr><td>proxy</td><td>2</td></tr>
<tr><td>haldaemon</td><td>2</td></tr>
<tr><td>daemon</td><td>2</td></tr>
<tr><td>avahi</td><td>2</td></tr>
<tr><td>www-data</td><td>1</td></tr>
<tr><td>uml-net</td><td>1</td></tr>
<tr><td>statd</td><td>1</td></tr>
<tr><td>ntp</td><td>1</td></tr>
<tr><td>messagebus</td><td>1</td></tr>
<tr><td>Debian-exim</td><td>1</td></tr>
<tr><td>clamav</td><td>1</td></tr>
</table>
</body>
</html>
```
En enregistrant la sortie dans un fichier d'extension .html et
en ouvrant ce fichier dans un navigateur vous devrez observer le
résultat suivant :
<html>
<body>
<table border="1">
<tr><td>root</td><td>136</td></tr>
<tr><td>davalan</td><td>91</td></tr>
<tr><td>dansguardian</td><td>11</td></tr>
<tr><td>proxy</td><td>2</td></tr>
<tr><td>haldaemon</td><td>2</td></tr>
<tr><td>daemon</td><td>2</td></tr>
<tr><td>avahi</td><td>2</td></tr>
<tr><td>www-data</td><td>1</td></tr>
<tr><td>uml-net</td><td>1</td></tr>
<tr><td>statd</td><td>1</td></tr>
<tr><td>ntp</td><td>1</td></tr>
<tr><td>messagebus</td><td>1</td></tr>
<tr><td>Debian-exim</td><td>1</td></tr>
<tr><td>clamav</td><td>1</td></tr>
</table>
</body>
Si vous avez besoin d'informations complémentaires sur html, vous pouvez allez voir [w3schools.com](https://www.w3schools.com/tags/default.asp).
Loading…
Cancel
Save