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