Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2786 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  exit dans une boucle if ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

exit dans une boucle if ?

n°2013251
mic_12
Posté le 30-07-2010 à 16:48:01  profilanswer
 

Bonjour,

 

Voici un bout de mon script shell :

 
Citation :

cat $ORALOG |while read DATA
do
  NB=$(($NB+1))
  TABLE=`sed -n "${NB}p" $LST`
  DATA_OLD=`sed -n "${NB}p" $ORALOG_OLD`
  if [ ! -e "$ORALOG_OLD" ] || [ -z DATA_OLD ]
  then
    echo "ERREUR !!! Le fichier de log $ORALOG_OLD est vide ou inexistant !!!" >> $LOG
    mail -s " Echec !!! blabla " $DEST <$LOG 1>/dev/null 2>&1
    exit 3
  elif [ DATA -lt DATA_OLD ]
     then
       NBLIGNE=$(($DATA_OLD - $DATA))
       echo "Il y a $DATA lignes dans la table $TABLE" >> $LOG
       echo "ATTENTION !!!! Il manque $NBLIGNE lignes dans la table $TABLE !!!" >> $LOG
  elif [ DATA -eq DATA_OLD ]
     then
       echo "Il y a $DATA lignes dans la table $TABLE" >> $LOG
  elif [ DATA -gt DATA_OLD ]
     then
       NBLIGNE=$(($DATA - $DATA_OLD))
       echo "Il y a $DATA lignes dans la table $TABLE" >> $LOG
       echo "$NBLIGNE lignes ont ete ajoutees dans la table $TABLE" >> $LOG
  fi
done

 

J'aimerais comprendre pourquoi mon exit3 ne fonctionne pas s'il vous plait. il sort de la boucle mais continue la suite du script :(

Message cité 1 fois
Message édité par mic_12 le 30-07-2010 à 16:49:31

---------------
Site photo
mood
Publicité
Posté le 30-07-2010 à 16:48:01  profilanswer
 

n°2013270
mrbebert
Posté le 30-07-2010 à 17:51:22  profilanswer
 

Parce que le "while" va créer un sous-shell ? Et que le "exit" va donc sortir de ce sous-shell, pas du shell principal [:figti]

n°2013273
mic_12
Posté le 30-07-2010 à 18:13:57  profilanswer
 

sans doute quelque chose dans ce goût là :jap:
j'ai modifié mon script de manière à ce que ca ne me pose plus de problème :)


---------------
Site photo
n°2013275
Sve@r
Posté le 30-07-2010 à 18:19:14  profilanswer
 

mrbebert a écrit :

Parce que le "while" va créer un sous-shell ? Et que le "exit" va donc sortir de ce sous-shell, pas du shell principal [:figti]


 
 
 

mic_12 a écrit :

Bonjour,
 
Voici un bout de mon script shell :
 

Citation :

cat $ORALOG |while read DATA
do
  NB=$(($NB+1))
  TABLE=`sed -n "${NB}p" $LST`
  DATA_OLD=`sed -n "${NB}p" $ORALOG_OLD`
  if [ ! -e "$ORALOG_OLD" ] || [ -z DATA_OLD ]
  then
    echo "ERREUR !!! Le fichier de log $ORALOG_OLD est vide ou inexistant !!!" >> $LOG
    mail -s " Echec !!! blabla " $DEST <$LOG 1>/dev/null 2>&1
    exit 3
  elif [ DATA -lt DATA_OLD ]
     then
       NBLIGNE=$(($DATA_OLD - $DATA))
       echo "Il y a $DATA lignes dans la table $TABLE" >> $LOG
       echo "ATTENTION !!!! Il manque $NBLIGNE lignes dans la table $TABLE !!!" >> $LOG
  elif [ DATA -eq DATA_OLD ]
     then
       echo "Il y a $DATA lignes dans la table $TABLE" >> $LOG
  elif [ DATA -gt DATA_OLD ]
     then
       NBLIGNE=$(($DATA - $DATA_OLD))
       echo "Il y a $DATA lignes dans la table $TABLE" >> $LOG
       echo "$NBLIGNE lignes ont ete ajoutees dans la table $TABLE" >> $LOG
  fi
done


 
J'aimerais comprendre pourquoi mon exit3 ne fonctionne pas s'il vous plait. il sort de la boucle mais continue la suite du script :(


 
Il y avait longtemps qu'on n'avait pas vu un neuneu parler de "boucle if" (cf ton titre). Ben tu apprendras que l'alternative "if" n'est pas une boucle. C'est pour ça que si on met un break dans un if, on sort de la boucle qui encadre ce if et non du if lui-même !!!
 
Concernant ton pb, mrbebert a donné la bonne réponse. En fait, plus précisément, c'est le pipe qui crée le sous-shell. Supprime le pipe et le exit fonctionnera
 
Accessoirement, j'ai repéré d'autres détails
1) tu oublies systématiquement le caractère "$" devant tes noms de variable. M'est avis que tes tests ne vont pas trop bien fonctionner
 
2) l'instruction [ -z DATA_OLD ] (ou plutôt [ -z $DATA_OLD ] car ça me semble plus cohérent avec l'idée générale de ce genre de test) ne fonctionnera jamais. Parce que, si la variable est vide, le shell verra [ -z ] et ce test ne sera jamais vrai. Faut toujours encadrer les variables de guillemets lors des tests littéraux  
=> [ -z "$DATA_OLD" ]
 
3) l'instruction if [ ! -e "$ORALOG_OLD" ] || [ -z "$DATA_OLD" ] fait deux appels à la commande "test". Or, cette commande possède le connecteur "or" qui permet de grouper les conditions => if [ ! -e "$ORALOG_OLD" -o -z "$DATA_OLD" ]


Message édité par Sve@r le 30-07-2010 à 18:22:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  exit dans une boucle if ?

 

Sujets relatifs
boucle pour ouvrir plusieurs fichiers en CAide pour boucle for shell DOS
PHP Pb de sortie de boucle[Résolu] Petit problème "for" déjà dans une boucle ...
[c] 1er joueur Niquel 2nd ... en boucle :/VBA, boucle For i = a to b a>b POSSIBLE ?
Condition If...End if à l'intérieur d'une boucle For...Next[Script]en .bat pour Test FTP en boucle
Débutant need Help en CProblème de boucle [resolu]
Plus de sujets relatifs à : exit dans une boucle if ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR