ptits pb de scripts sh .... sujet d'interro inside

ptits pb de scripts sh .... sujet d'interro inside - Linux et OS Alternatifs

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 :)))

Reply

Marsh Posté le 16-01-2002 à 21:58:44   

Reply

Marsh Posté le 16-01-2002 à 22:06:22    

until test-commands; do consequent-commands; done
 
grep "toto*"  (ou une expression reguliere)  /root/*


---------------
root 66
Reply

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


---------------
root 66
Reply

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

Reply

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 ??

Reply

Marsh Posté le 16-01-2002 à 22:24:03    

bonne question , until est particulierement penible chez moi aussi .  reste sur while .


---------------
root 66
Reply

Marsh Posté le 16-01-2002 à 22:24:53    

et j'ai des differences de comportements entre bash et zsh aussi ...


---------------
root 66
Reply

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 !!!

Reply

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
 
++

Reply

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

Reply

Marsh Posté le 17-01-2002 à 11:10:04   

Reply

Marsh Posté le 17-01-2002 à 11:10:56    

je continue :
if test -z variable
then exit
else
grep $variable /etc/group
elif

Reply

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]


---------------
root 66
Reply

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]


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:00:40    

Je vais tester ça , si ça marche , un Grand grand merci !!!!

Reply

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]


---------------
root 66
Reply

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]

Reply

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 ? ;)


---------------
root 66
Reply

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

Reply

Marsh Posté le 17-01-2002 à 12:12:24    

#!/bin/sh
 
[ $# ..tralala ]
 
cd $1
for in `ls` ....  
until
do
 ....
done


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:14:38    

Et là , c'est mieux ???
:D
 
#!/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

Reply

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 ...)


---------------
root 66
Reply

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 ? :D


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:17:17    

ch'uis fatigué moâ , c'est [ $# -lt 1 ] , 'scuse moi :D


---------------
root 66
Reply

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  ...

Reply

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 :p


---------------
root 66
Reply

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 ....

Reply

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 ? :p ..   c'est pas plutot l'UID ?


---------------
root 66
Reply

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 ?

Reply

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 ...

Reply

Marsh Posté le 17-01-2002 à 12:37:23    

attend , pas de panique : la recherche des users sur un gid donné en une ligne :D  (et testé ! )
 
[ $# -lt 1 ] && { echo "usage: $0 <gid>";exit; } || { grep $1 /etc/passwd | cut -f1 -d: ; }


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:39:32    

404notfound a écrit a écrit :

Et là , c'est mieux ???  
:D  
 
#!/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) ;)


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:40:37    

Merci  :eek2: , 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  :D )
 
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

Reply

Marsh Posté le 17-01-2002 à 12:41:39    

mais ya un cas particulier sur lequel il faut mettre plus de ligne quand meme ;)


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:42:28    

euh ??? c'est koi ce cas particulier ???

Reply

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 .


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:49:45    

et pis verifier qu'on a pas 'greper' l'uid au lieu du gid ... :D


---------------
root 66
Reply

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 ...

Reply

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


---------------
root 66
Reply

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 :D


---------------
root 66
Reply

Marsh Posté le 17-01-2002 à 12:56:53    

il me semble que j'aurais du attendre deux minutes avant d'envoyer le mail  :cry:  
... dis-moi , si t'es aussi fort , c'est par plaisir ou tu bosses là-dedans ??

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed