exit dans une boucle if ?

exit dans une boucle if ? - Shell/Batch - Programmation

Marsh Posté le 30-07-2010 à 16:48:01    

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
Reply

Marsh Posté le 30-07-2010 à 16:48:01   

Reply

Marsh Posté le 30-07-2010 à 17:51:22    

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]

Reply

Marsh Posté le 30-07-2010 à 18:13:57    

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
Reply

Marsh Posté le 30-07-2010 à 18:19:14    

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

Sujets relatifs:

Leave a Replay

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