exit dans une boucle if ? - Shell/Batch - Programmation
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
Marsh Posté le 30-07-2010 à 18:13:57
sans doute quelque chose dans ce goût là
j'ai modifié mon script de manière à ce que ca ne me pose plus de problème
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 |
mic_12 a écrit : Bonjour,
|
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" ]
Marsh Posté le 30-07-2010 à 16:48:01
Bonjour,
Voici un bout de mon script shell :
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 édité par mic_12 le 30-07-2010 à 16:49:31
---------------
Site photo