ptits pb de scripts sh .... sujet d'interro inside - Linux et OS Alternatifs
Marsh Posté le 16-01-2002 à 22:06:22
until test-commands; do consequent-commands; done
grep "toto*" (ou une expression reguliere) /root/*
Marsh Posté le 16-01-2002 à 22:07:39
7.4 Until sample
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
Marsh Posté le 16-01-2002 à 22:11:01
Merci -> voilà exactement le truc :
Avec while , ça marche :
while [ ! $chou = "OK" ]
echo "----------------------------------------------------------------"
echo "choix OK fin"
echo "choix 1 Date du jour"
echo "choix 2 Liste des personnes connectées sur la machine"
echo "choix 3 Liste des fichiers du repertoire courant"
echo "choix 4 Nom du repertoire courant"
echo "----------------------------------------------------------------"
read chou
#lit la valeur entrée par l'utilisateur
do
case $chou in
OK) exit ;;
1) date ;;
2) who ;;
3) ls -al ;;
4) pwd ;;
esac
done
Mais avec Until ça foire ... et ça c'est qu'un exemple , j'ai fait une dizaine de scripts dans le genre qui marchent avec while , mais plus avec until cad la condition inverse ....
until [ $chou = "OK" ]
echo "----------------------------------------------------------------"
echo "choix OK fin"
echo "choix 1 Date du jour"
echo "choix 2 Liste des personnes connectées sur la machine"
echo "choix 3 Liste des fichiers du repertoire courant"
echo "choix 4 Nom du repertoire courant"
echo "----------------------------------------------------------------"
read chou
#lit la valeur entrée par l'utilisateur
do
case $chou in
OK) exit ;;
1) date ;;
2) who ;;
3) ls -al ;;
4) pwd ;;
esac
done
Jvais essayer Merci
Marsh Posté le 16-01-2002 à 22:12:55
si j'ai bien compris , pour le until , c'est du "test" que venait l'erreur ??
Marsh Posté le 16-01-2002 à 22:24:03
bonne question , until est particulierement penible chez moi aussi . reste sur while .
Marsh Posté le 16-01-2002 à 22:24:53
et j'ai des differences de comportements entre bash et zsh aussi ...
Marsh Posté le 16-01-2002 à 22:29:50
merci , c'est bien ce qu'il me semblait pour le "until" .... c'est pas génial ...pour les ptits pb entre les différents shells , certains scripts ne fonctionnent tout simplement pas d'un shell à l'autre .
Pour le grep , en fait , c'est l'étoile qui cherche dans tous les paramètres , si j'ai bien compris ? j'aurais dû y penser !!! Merci beaucoup !!!
Marsh Posté le 17-01-2002 à 10:21:24
Le probleme peut venir de l'initialisation d'une variable
Qd tu fais un test sur une variable non initialisee, tu as une erreur d'execution
Je ne sais pas si ton probleme vient de la, mais perso je mets toujours mes variables entre double quotes dans mes tests
du genre :
until [ "${machin}" = "OK" ]
do
mes_commandes
done
Par contre je ne comprends pas dans ton script pourquoi tu mets des trucs entre le until et le do ??
Pourquoi tu ne les mets pas
- soit avant le until
- soit apres le do
mais entre les deux je ne vois vraiment pas
++
Marsh Posté le 17-01-2002 à 11:10:04
Bijour , voilà ce script qui ne marche pas très bien , je voudrait qu'il s'execute sous la forme : nom_du_script nom_du_répertoire_enparamètre
et qu'en plus de tout ce qu'il est censé faire il vérifie à chaque fois si le répertoire en paramètre existe ...j'ai essayé avec le "test -d" , mais ça marche pas ...
Le script :
cd $a
until [ $choix = "Q" ]
for a in `ls -al`
do
if test -d $a
then
echo $a
fi
echo "-------------------------------------------------------------------"
echo "Afficher les attributs du repertoire"
echo "Lister les fichiers du répertoire"
echo "Créer un répertoire"
echo "Supprimer un répertoire"
echo "Rechercher une chaine de caractèe parmi les fichiers du repertoire"
echo "Quitter"
echo "-------------------------------------------------------------------"
echo "Votre Choix ?"
echo "-------------------------------------------------------------------"
read choix
case $choix in
A) echo "Voici les droits d'accès du répertoire :"
ls -ld $a ;;
L) echo "Voici la liste des fichiers du répertoire :"
ls -al $a;;
C) echo "Entrez un nom de répertoire"
read reper
mkdir $reper > $a ;;
#crée le repertoire dans le repertoire passé en paramètre au début
S) echo "Suppimer un repertoire "
"Quel repertoire voulez-vous supprimer ?"
read repertoire
rmdir $repertoire ;;
R) echo " Recherche d'une chaine de caractère parmi les fichiers du répertoire"
echo " Quelle chaine de caractère voulez-vous chercher ?"
read chainecarac
grep $chainecarac ;;
Q) echo "Bye Bye"
exit ;;
esac
done
J'ai aussi fait un script qui doit chercher le GID du groupe ou d'un utilisateur entré en pramaètre dans le fichier /etc/passwd , mais ça marche pas non plus ...
Le script :
if test -z variable
Marsh Posté le 17-01-2002 à 11:10:56
je continue :
if test -z variable
then exit
else
grep $variable /etc/group
elif
Marsh Posté le 17-01-2002 à 11:57:15
[ $# -lt 1 ] && { echo "usage : $0 <repertoire>"; exit; }
for i in `ls $1/*`;do [ -d $i ] && echo $i; done
[edtdd]--Message édité par saudium--[/edtdd]
Marsh Posté le 17-01-2002 à 11:59:09
pour la recherche du gid d'un groupe passé en parametre
grep $1 /etc/group && cut -f3 -d:
[edtdd]--Message édité par saudium--[/edtdd]
Marsh Posté le 17-01-2002 à 12:00:40
Je vais tester ça , si ça marche , un Grand grand merci !!!!
Marsh Posté le 17-01-2002 à 12:01:57
j'ai edité mes posts et tout fonctionne
...ou presque , je viens de m'apercevoir d'un truc ...
reprend ta methode ou tu te deplaces dans $1
cd $1
et pis un for i in `ls` tout court cette fois .
sinon il aime pas le ls $1
[edtdd]--Message édité par saudium--[/edtdd]
Marsh Posté le 17-01-2002 à 12:05:30
La c'est comme ça , y'a plus rien à toucher normalement ??
(message edité)
cd $1
until [ $choix = "Q" ]
[ $# -lt 1 ] && { echo "usage : $0 <repertoire>"; exit; }
for i in `ls`;do [ -d $i ] && echo $i; done
echo "-------------------------------------------------------------------"
echo "Afficher les attributs du repertoire"
echo "Lister les fichiers du répertoire"
echo "Créer un répertoire"
echo "Supprimer un répertoire"
echo "Rechercher une chaine de caractèe parmi les fichiers du repertoire"
echo "Quitter"
echo "-------------------------------------------------------------------"
echo "Votre Choix ?"
echo "-------------------------------------------------------------------"
read choix
case $choix in
A) echo "Voici les droits d'accès du répertoire :"
ls -ld $1 ;;
L) echo "Voici la liste des fichiers du répertoire :"
ls -al $1;;
C) echo "Entrez un nom de répertoire"
read reper
mkdir $reper > $1 ;;
#crée le repertoire dans le repertoire passé en paramètre au début
S) echo "Suppimer un repertoire "
"Quel repertoire voulez-vous supprimer ?"
read repertoire
rmdir $repertoire ;;
R) echo " Recherche d'une chaine de caractère parmi les fichiers du répertoire"
echo " Quelle chaine de caractère voulez-vous chercher ?"
read chainecarac
grep $chainecarac ;;
Q) echo "Bye Bye"
exit ;;
esac
done
[edtdd]--Message édité par 404notfound--[/edtdd]
Marsh Posté le 17-01-2002 à 12:09:01
le test [ $# ... c'est pour tester s'il y a bien un parametre , donc à mettre au tout debut du script !
ensuite il faut pas un do apres le until ?
et pis ca devrait tourner ?
Marsh Posté le 17-01-2002 à 12:11:46
Le truc , c'est que je dois envoyer ce script par mail à mon prof , c'est mon sujet d'interro , tu crois que c'est bon ??
Pour le second script , le test -z est faux ??? parce qu'en fait j'aimerais bien tester si le paramètre existe lorsqu'il fait une recherche .
merci
Marsh Posté le 17-01-2002 à 12:12:24
#!/bin/sh
[ $# ..tralala ]
cd $1
for in `ls` ....
until
do
....
done
Marsh Posté le 17-01-2002 à 12:14:38
Et là , c'est mieux ???
#!/bin/sh
[ $# -lt $1 ] && { echo "usage : $0 <repertoire>"; exit; }
cd $1
for i in `ls $1/*`;do [ -d $i ] && echo $i; done
until [ $choix = "Q" ]
do
echo "-------------------------------------------------------------------"
echo "Afficher les attributs du repertoire"
echo "Lister les fichiers du répertoire"
echo "Créer un répertoire"
echo "Supprimer un répertoire"
echo "Rechercher une chaine de caractèe parmi les fichiers du repertoire"
echo "Quitter"
echo "-------------------------------------------------------------------"
echo "Votre Choix ?"
echo "-------------------------------------------------------------------"
read choix
case $choix in
A) echo "Voici les droits d'accès du répertoire :"
ls -ld $1 ;;
L) echo "Voici la liste des fichiers du répertoire :"
ls -al $1;;
C) echo "Entrez un nom de répertoire"
read reper
mkdir $reper > $1 ;;
#crée le repertoire dans le repertoire passé en paramètre au début
S) echo "Suppimer un repertoire "
"Quel repertoire voulez-vous supprimer ?"
read repertoire
rmdir $repertoire ;;
R) echo " Recherche d'une chaine de caractère parmi les fichiers du répertoire"
echo " Quelle chaine de caractère voulez-vous chercher ?"
read chainecarac
grep $chainecarac ;;
Q) echo "Bye Bye"
exit ;;
esac
done
Marsh Posté le 17-01-2002 à 12:14:55
si un parametre existe ? et en testant simplement s'il y a au moins un parametre plutot que "l existence" d'un parametre ?
$# contient le nombre de parametres +1 (le nom du script est pris en compte et on peut le recuperer par $0 , le 1er parametre est $1 et ainsi de suite ...)
Marsh Posté le 17-01-2002 à 12:15:59
for i in `ls` (on oublie le $1 , ca chie un peu sinon )
t'as rien pour tester sous la main ?
Marsh Posté le 17-01-2002 à 12:17:17
ch'uis fatigué moâ , c'est [ $# -lt 1 ] , 'scuse moi
Marsh Posté le 17-01-2002 à 12:17:30
Pour le sujet exact :
ecrire un script qui récupère le GID du de l'ensemble des usagers du groupe donné en paramètre dans le fichier /etc/passwd
vous vérifierez la présence du paramètre ...
Marsh Posté le 17-01-2002 à 12:18:24
allez promis c'te fois , je te ferais un script qui marche testé , approuvé , estampillé label rouge
Marsh Posté le 17-01-2002 à 12:18:40
Pour tester , fô que je reboote , et y'a pas de drivers pour mon modem numéris usb sous linux ... en plus jsuis sous aol , donc mission quasi impossible ....
Marsh Posté le 17-01-2002 à 12:25:56
404notfound a écrit a écrit : Pour le sujet exact : ecrire un script qui récupère le GID du de l'ensemble des usagers du groupe donné en paramètre dans le fichier /etc/passwd vous vérifierez la présence du paramètre ... |
attend , j'ai deja du mal à decrypter le probleme : y veut quoi ? passer un parametre id de groupe au script et recuperer le GID des users ? .. c'est pas plutot l'UID ?
Marsh Posté le 17-01-2002 à 12:29:47
Yes , en fait , par exemple
tu tapes : script_recherche nom_dugroupe
et ce script va afficher toutes les utilisateur du groupe passé en paramrètre .
Si ce groupe n'existe pas (cad s'il ne trouve pas la chaine de caractère passée en paramètre dans /etc/passwd ) , fin du script .
Pour le script précédent , ça a l'air bon , non je l'envoie ?
Marsh Posté le 17-01-2002 à 12:30:46
Un grand merci encore une fois d'avance !!!
Le premier script est noté sur 14 , ça fait mal ...
Marsh Posté le 17-01-2002 à 12:37:23
attend , pas de panique : la recherche des users sur un gid donné en une ligne (et testé ! )
[ $# -lt 1 ] && { echo "usage: $0 <gid>";exit; } || { grep $1 /etc/passwd | cut -f1 -d: ; }
Marsh Posté le 17-01-2002 à 12:39:32
404notfound a écrit a écrit : Et là , c'est mieux ??? #!/bin/sh [ $# -lt $1 ] && { echo "usage : $0 <repertoire>"; exit; } cd $1 for i in `ls $1/*`;do [ -d $i ] && echo $i; done until [ $choix = "Q" ] do ..... |
for i in `ls` ;do [ -d $i ] && echo $i; done
et tu fais gaffe , les ` (backquote) c'est pas des '(apostrophe)
Marsh Posté le 17-01-2002 à 12:40:37
Merci , je vais tout envoyer je crois , mais j'ai peur que ça se voie , je ne suis pas encore capable de faire des trucs comme ça (même si c'est dans le cours )
A ton avis c'est bon comme ça si j'envoie la dernière version du gros script et le petit script de recheche de GID ?
Merci
Marsh Posté le 17-01-2002 à 12:41:39
mais ya un cas particulier sur lequel il faut mettre plus de ligne quand meme
Marsh Posté le 17-01-2002 à 12:46:17
toto:x:17:15
titi:x:89:151
on recherche le groupe 15 .
le grep va te retourner egalement le 151 . il faut donc tester .
Marsh Posté le 17-01-2002 à 12:49:45
et pis verifier qu'on a pas 'greper' l'uid au lieu du gid ...
Marsh Posté le 17-01-2002 à 12:50:06
A oui , ok i understand ... bon c'est pas grave , j'ai déjà envoyé le mail .... avec presque deux heures de retard ... tant pis .
Je pense que j'aurais la moyenne quand même ...
en grande partie grace à toi !!
Merci beaucoup !!!
Ce qui est dingue , c'est que c'est toujours facile quand on lit le cours , mais dès qu'on est sur un ordi à deux francs de la fac .... bein ça merde ...
Marsh Posté le 17-01-2002 à 12:53:28
#!/bin/sh
[ $# -lt 1 ] && { echo "usage : $0 <groupe>"; exit; }
lst=`grep $1 /etc/passwd`
for i in $lst
do
gid=`echo $i | cut -f4 -d:`
[ "$gid" = "$1" ] && { echo $i | cut -f1 -d: ;}
done
Marsh Posté le 17-01-2002 à 12:54:38
t'as deja envoyé le mail ? raaaahhh
je viens de me prendre la tete pour que ca marche
Marsh Posté le 17-01-2002 à 12:56:53
il me semble que j'aurais du attendre deux minutes avant d'envoyer le mail
... dis-moi , si t'es aussi fort , c'est par plaisir ou tu bosses là-dedans ??
Marsh Posté le 16-01-2002 à 21:58:44
bjr voilà , j'ai interro d'unix (c'est juste une initiation)
et le but du jeu c'est de faire qques scripts sous shell de bourne .
Bon jusqu'à présent , à peu près tous les scripts passent bien , mais j'arrive pas à utiliser la condition until sans que ça m...
Je m'explique :
par exemple :
while [ ! $choix = 0 ]
read choix
... etc fin du script , ça ça marche sans problème
mais le même avec until :
until [ $choix = 0 ]
read choix
.... etc fin du script , là , soit ça ne donne aucun résultat , soit j'ai un truc du genre "unary operator expected" ...
Où est le problème à votre avis ???
Deuxième Question , j'ai regardé le manuel de la commande grep , mais je ne sais pas comment faire pour trouver une chaine de caractère dans les fichiers d'un repertoire .
Explication -> si dans le repertoire /root j'ai un fichier texte qui contient le mot "guignol" , quelle commande me trouvera le mot "guignol" parmis les fichiers du répertoire ?
Merci d'avance ))