Bonjour
Qui peut m'aider svp ?
Vous trouvez ci-joint le TP complet. Si vous pouvez m'aider à comprendre, ça serait gentil de votre part merci ! J'attends vos réponses !
Version imprimable
Bonjour
Qui peut m'aider svp ?
Vous trouvez ci-joint le TP complet. Si vous pouvez m'aider à comprendre, ça serait gentil de votre part merci ! J'attends vos réponses !
Bonjour,
il n'y a rien de vraiment compliqué : lis attentivement tes cours, et les tutos inscrits dans ma signature.
seul l'exercice I-7 requiert des explications que seul ton professeur peut donner.
J'ai quelques difficultés parce que je voudrais étudier lunix et surtout que c'est une autoformation pour moi. J'ai juste trouvé ce TP et je n'ai pas bien compris
Merci quand même pour votre réponse donc je vais essayer de résoudre ces exercices et je vais vous faire part des résultats
Bonjour
Q1: il faut tester le nombre de paramètres. Ce nombre est stocké dans une variable bien précise que tu dois connaitre
Q2: le nom du programme se trouve lui-aussi dans une variable précise
Q3: faut utiliser "*"
Q4: tu as une option spéciale dans la commande test pour vérifier qu'un fichier est exécutable
Q5: c'est un peu spécial car il ya getopt et/ou getopts qui te permettent de gérer les options mais je ne sais pas si le prof vous a appris à utiliser ces deux outils. Sans ça il faut alors regarder les arguments un à un et détecter les options
Q6: peut-être t'as le droit d'utiliser find sinon il te faudra programmer une fonction récursive
Q7: te faut que ff écrive son résultat dans un fichier et que lastfind aille lire ce fichier
Q8: comme Q4 sauf que les fichiers seront copiés au lieu d'être affichés
Q9: faut traiter le flux envoyé par ls. Si ton prof te l'a appris c'est ls |while read f; do ... done sinon tu as aussi for f in $(ls); do ... done mais c'est moins propre (si un fichier a un espace dans son nom ça buggue)
Q10: rajouter un compteur à Q9
Q11: avec l'instruction set $(ls rep) ça te place les fichiers situés dans rep dans les variables positionnelles $1 $2 $3 ...
Te suffit ensuite de traiter $1 puis d'utiliser shift pour décaler ces paramètres et placer $2 dans $1, $3 dans $2 et etc Et ce jusqu'à ce que le nombre de paramètres (le même que dans Q1) passe à 0
Avant de faire le TP 4, t'as essayé les TP 1, 2 et 3 ???
Merci Frederic pour votre réponse personnellement j'ai juste fait des exercices sur internet mai j'ai pas vu les tp 1, 2 ,3 mais est ce que c'est important de les faires ???
Théoriquement les TP sont de difficulté croissante et sont fait pour enseigner des notions qui serviront d'appui pour les notions suivantes. Ainsi faire le TP n° 2 présuppose (si on suit la logique de l'enseignement) de maîtriser les notions du TP n° 1...
Exemple 1: si on n'a pas vu un TP qui exerce à utiliser la commande test, on aura beaucoup de mal à la mettre en oeuvre la Q4 qui s'appuie dessus...
Exemple 2: connais-tu la variable $# et son rôle ??? Si tu ne la connais pas tu auras du mal aux questions Q1 et Q11 parce que tu devras la retrouver par toi-même alors que peut-être les TP 1, 2 et 3 la montrent plus en détail...
Ceci dit; si tu nous montres ce que tu as fait on sera plus à même de t'aider...
Pour les variables d'environnement en shell, ceci devrait te servir : ( à moi aussi d'ailleurs )
http://www.epons.org/shell-bash-variables.php
bash fait référence à un shell particulier. Les plus connus sont :
sh (bourne shell ), bash ( bourne again shell ), csh ( c-shell ),ksg ( korn shell), liste non exhaustive.
Pour un débutant, peu importe. certains ont des fonctionnalités plus évolués que d'autres.
Si ça t’intéresses, regardes sur Wikipedia par exemple.
voici ce que j'ai réussi a faire
1)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 echo "entrez le de user" read util if grep -w "$util" /etc/passwd>/dev/null then echo "existe" if who|grep -w "$util">/dev/null then echo "$util est branche" else echo "$util n'est pas branche" fi else echo "n'existe pas" fi;;
Bon Voici la réponse de l'EXERCICE 2
Svp corrigez si vous trouvez une erreur
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 #!/bin/bash echo "----------menu principal--------- " until false do echo " option description" echo " ------- ----------------------------------------" echo " 0 sortie du menu" echo " 1 utilisateur en ligne" echo " 2 information sur un fichier" echo " 3 information sur un utilisateur" echo " 4 modification des droite d'acces" echo " 5 supprission des fichier" echo " entrez votre choix :" read rep case $rep in 0)exit;; 1)echo "entrez le de user" read util if grep -w "$util" /etc/passwd>/dev/null then echo "existe" if who|grep -w "$util">/dev/null then echo "$util est branche" else echo "$util n'est pas branche" fi else echo "n'existe pas" fi;; 2)echo "entrer le de fichier" read f1 if [ -e $f1 ] then echo "existe" if [ -w $f1 ] then echo "modifiable" fi if [ -r $f1 ] then echo "lisible" fi if [ -x $f1 ] then echo "executable" fi ls -l $f1|cut -c2-10 if [ -s $f1 ] then echo "non vide" else echo "vide" fi else echo "n'existe pas" fi;; 3)echo "donner le nom d'utilisateur" read Nom if [ -z $Nom ] then cat /etc/passwd|tr -s ":"|cut -d ":" -f 1,3,4|more else if grep -w "^$Nom" /etc/passwd>/dev/null then cat /etc/passwd|grep -w "^$Nom"|tr -s ":"|cut -d ":" -f 1,3,4 fi fi;; 4)until false do echo " entrer nom de fichier" read rep if [ -e $rep ] then ls -l "$rep" echo "entrer les nouveaux droits que voulez-vous appliquer sur fich" read nombre if [ $nombre -le 777 ] then chmod $nombre $rep ls -l $rep else echo "nombre incorrect" fi fi echo "voulez vous continuer ou retour au menu principal" read reponse if [ $reponse = "oui" ] then echo "+++++++++++++++++++++++++++++++++++++++++++++++" else break fi done;; 5)until false do echo "entrer le nom de fichier ou d'un repertoire" read reponse if [ -e $reponse ] then if [ -f $reponse ] then echo "voulez vous vraiment supprimer ce fichier oui ou non" read rep if [ $rep = oui ] then rm -f $reponse fi fi if [ -d $reponse ] then echo "voulez vous vraiment supprimer ce rep?(oui ou non)" read rep2 if [ $rep2 = "oui" ] then rm -r $reponse fi fi fi echo "voulez vous continuer ou retour au menu principal" read reponse if [ $reponse = "oui" ] then echo "++++++++++++++++++++++++++++++++++++++++++++++" else break fi done;; esac echo "tapez 'retour' pour contiuer ou 'non' pour terminer" read rep if [ $rep = "retour" ] then echo "++++++++++++++++++++++++++++++++++++++++++++++" else exit fi done
Pas mal. A l'aise avec l'utilisation des programmes Unix comme "palpeur" (utiliser un programme uniquement pour détecter sa réussite ou son échec comme tu le fais avec grep).
Cet exo n'a rien à voir avec l'énoncé que tu nous as donné où je lis " Comment incorporer un contrôle du nombre de paramètres au début d’un script?" mais bon...
Petite amélioration: étant donné que le user se trouve en début de ligne dans /etc/passwd, tu peux rajouter à grep de ne traiter que les débuts de ligne en mettant un petit "^".
Toutefois si tu as un user "abcd" et que tu demandes "abc", ton programme dira qu'il existe ce qui n'est pas vrai. Or, dans /etc/passwd, le user est suivi du caractère ":". Donc tu peux utiliser aussi ce détail.
Ce qui donnerait alors if grep -w "^$util:" /etc/passwd>/dev/null pour ton test...
Pour le second exo, remplace les exit (trop brutaux) par des break. En effet, si tu sors de ta boucle principale alors tu sors forcément du programme puisqu'il n'y a rien d'autre.
Ensuite until false ok mais pourquoi pas while true ? Si tu as deux instructions équivalentes autant prendre la plus naturelle (mais c'est une question de point de vue personnel).
Et enfin tout ton code traitant les différents cas peut-être le mettre dans des fonctions que tu appellerais ce qui le rendrait plus modulable.
Mais dans l'ensemble tu n'as aucun soucis en shell et ton premier post ne se justifie pas vraiment.
[edit]Ah oui, indente ton code parce que là, c'est vraiment ilisible
Ton second exo réécrit en indenté et simplification de certains tests
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 #!/bin/bash echo "----------menu principal--------- " until false do echo " option description" echo " ------- ----------------------------------------" echo " 0 sortie du menu" echo " 1 utilisateur en ligne" echo " 2 information sur un fichier" echo " 3 information sur un utilisateur" echo " 4 modification des droite d'acces" echo " 5 supprission des fichier" echo " entrez votre choix :" read rep case $rep in 0) exit;; 1) echo "entrez le de user" read util if grep -w "$util" /etc/passwd>/dev/null then echo "existe" who|grep -w "$util">/dev/null\ && echo "$util est branche"\ || echo "$util n'est pas branche" else echo "n'existe pas" fi;; 2) echo "entrer le de fichier" read f1 if [ -e $f1 ] then echo "existe" [ -w $f1 ] && echo "modifiable" [ -r $f1 ] && echo "lisible" [ -x $f1 ] && echo "executable" ls -l $f1|cut -c2-10 [ -s $f1 ] && echo "non vide" || echo "vide" else echo "n'existe pas" fi;; 3) echo "donner le nom d'utilisateur" read Nom if [ -z $Nom ] then cat /etc/passwd|tr -s ":"|cut -d ":" -f 1,3,4|more else grep -w "^$Nom" /etc/passwd>/dev/null\ && cat /etc/passwd|grep -w "^$Nom"|tr -s ":"|cut -d ":" -f 1,3,4 fi;; 4) until false do echo " entrer nom de fichier" read rep if [ -e $rep ] then ls -l "$rep" echo "entrer les nouveaux droits que voulez-vous appliquer sur fich" read nombre if [ $nombre -le 777 ] then chmod $nombre $rep ls -l $rep else echo "nombre incorrect" fi fi echo "voulez vous continuer ou retour au menu principal" read reponse [ $reponse = "oui" ]\ && echo "+++++++++++++++++++++++++++++++++++++++++++++++"\ || break done;; 5) until false do echo "entrer le nom de fichier ou d'un repertoire" read reponse if [ -e $reponse ] then if [ -f $reponse ] then echo "voulez vous vraiment supprimer ce fichier oui ou non" read rep [ $rep = oui ] && rm -f $reponse fi if [ -d $reponse ] then echo "voulez vous vraiment supprimer ce rep?(oui ou non)" read rep # Pourquoi une seconde variable rep2 ??? [ $rep = "oui" ] && rm -r $reponse fi fi echo "voulez vous continuer ou retour au menu principal" read reponse [ $reponse = "oui" ]\ && echo "+++++++++++++++++++++++++++++++++++++++++++++++"\ || break done;; esac echo "tapez 'retour' pour contiuer ou 'non' pour terminer" read rep [ $rep = "retour" ]\ && echo "++++++++++++++++++++++++++++++++++++++++++++++"\ || exit done
Bonjour,
Juste pour rajouter un petit détail sur grep, au lieu de faire une redirection vers /dev/null, il suffit d'utiliser l'option '-q' qui est une option posix (contrairement à -w) et en plus, la recherche s'arrêtera à la première occurence vrai, ce qui peut être un gain de temps dans le cas de fichier très volumineux ;)
Merci pour vos précieux conseils je vais faire ce que vous m'avez proposer de faire et si j'ai pas de problèmes avec les shell donc quelle est selon vous la prochaine étape que je dois étudier pour compléter un peu ma formation en unix!!?
Autre remarque où j'avais pas tilté: tu fais 2 appels à grep pour obtenir la même chose...
Savoir compiler et installer un programme téléchargé...Code:
1
2
3
4
5 result=$(grep -w "^$Nom:" /etc/passwd); status=$? if test $status -eq 0 then echo "$result"|cut -d ":" -f 1,3,4 fi