Comment sortir complètement de cette boucle ?

Comment sortir complètement de cette boucle ? - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 27-11-2014 à 12:00:25    

Bonjour,
 
J'ai un soucis avec l'un de mes scripts shell.
L'extrait du code correspond a un script qui va lire un fichier de paramètre formatté, et effectue un contrôle des valeurs sur une colonne.
 
Voici le bout de code qui m'ennuye :
 

Code :
  1. ###
  2. #
  3. # Controle fichier CFG existe et valeur de champ criticite
  4. #
  5. ###
  6. if [ ! -f ${cfgfile} ] ; then
  7.         func_err "Le fichier CFG "${cfgfile}" n'existe pas"
  8. else
  9.         func_info_log "Fichier CFG trouve : "${cfgfile}
  10.         cat ${cfgfile} | grep -v "#" | while read line
  11.         do
  12.                 level=`echo ${line} | awk -F: '{print $2}'`
  13.                 case ${level} in
  14.                 E)
  15.                 ;;
  16.                 W)
  17.                 ;;
  18.                 I)
  19.                 ;;
  20.                 *)
  21.                 func_info_log "Valeur de criticite ${level} invalide dans ${cfgfile}"
  22.                 func_err "Doit etre E (Erreur), W (Avertissement) ou I (Ignorer)"
  23.                 esac
  24.         done
  25.         func_info_log "Les criticites sont valides"
  26. fi
  27. # func_err "ESSAI POUR TESTER SORTIE DU SCRIPT"


 
 
Ci dessous la fonction 'func_err'
 

Code :
  1. func_err () {
  2.         err=$1
  3.         echo "ERR   : "${err}   >> ${logfile}
  4.         mail_flag=ERR
  5.         func_mail
  6.         exit 1
  7. }


 
Cette fonction func_err est utilisé dans X scripts et me fait un exit du script en cas d'erreur. Le script s'arrête donc totalement.
 
Dans l'exemple du dessus, la fonction est invoquée lorsque mon contrôle trouve des valeurs autres que 'E','W' et 'I'.
Par contre, le script ne se termine pas. Je sors de la boucle, et malheureusement le script continue :(
 
Help  :D


Message édité par Vince310884 le 27-11-2014 à 13:10:57
Reply

Marsh Posté le 27-11-2014 à 12:00:25   

Reply

Marsh Posté le 27-11-2014 à 16:29:43    


Une solution en passant par un fichier temporaire :

Code :
  1. ###
  2. #
  3. # Controle fichier CFG existe et valeur de champ criticite
  4. #
  5. ###
  6. if [ ! -f ${cfgfile} ] ; then
  7.         func_err "Le fichier CFG "${cfgfile}" n'existe pas"
  8. else
  9.         func_info_log "Fichier CFG trouve : "${cfgfile}
  10.         cat ${cfgfile} | grep -v "#" | while read line
  11.         do
  12.                 level=`echo ${line} | awk -F: '{print $2}'`
  13.                 case ${level} in
  14.                 E)
  15.                 echo 0 > ${tmpfile} ;;
  16.                 W)
  17.                 echo 0 > ${tmpfile} ;;
  18.                 I)
  19.                 echo 0 > ${tmpfile} ;;
  20.                 *)
  21.                 echo 1 > ${tmpfile}
  22.                 break ;;
  23.                 esac
  24.         done
  25.         exit_code=`cat ${tmpfile}`
  26.         if [ $exit_code -ne 0 ] ; then
  27.                 rm -f ${tmpfile}
  28.                 func_info_log "Valeur de criticite invalide dans ${cfgfile}"
  29.                 func_err "Doit etre E (Erreur), W (Avertissement) ou I (Ignorer)"
  30.         else
  31.                 rm -f ${tmpfile}
  32.                 func_info_log "Les criticites sont valides"
  33.         fi
  34. fi

Reply

Marsh Posté le 27-11-2014 à 19:36:43    

salut,
 
l'emploi d'un fichier temporaire n'a pas de sens.
si ça aide au fonctionnement de la sortie du script (ce dont je doute, vu que, moi, je n'ai pas de problème à le faire fonctionner sans :/), la valeur du code de retour peut être stockée dans une variable.
 
à part ça, ça n'aidera pas, mais plutôt que de tester que le fichier n'existe pas, tester s'il existe et inverser les cas d'exécution.


Message édité par Profil supprimé le 27-11-2014 à 19:37:01
Reply

Marsh Posté le 27-11-2014 à 22:11:54    

Le soucis c'est que les variable déclarés dans la boucle ne sont accessible que dans ladite boucle. J'arrive pas a recupérer mon code retour hors de la boucle. Tes propositions sont les bienvenues

Reply

Marsh Posté le 27-11-2014 à 23:37:29    

Code :
  1. grep 'motif' fichier | { while read line; do echo "$line"; var=set; done; echo "$var";}

si c'est du code sh.
si c'est du bash, alors utilise une Substitution de process.


Message édité par Profil supprimé le 27-11-2014 à 23:38:35
Reply

Marsh Posté le 29-11-2014 à 10:53:54    

Tu retapes en dur le code de func_err sans le exit 1 pour ton case *). Ecrire dans un fichier juste pour ça serait bcp trop coûteux.


Message édité par Tuxerman12 le 29-11-2014 à 10:55:46
Reply

Marsh Posté le 29-11-2014 à 22:47:00    

ton case *) n'est pas fermé par ;;


---------------
Les avis, c'est comme les anus, tout le monde en a un.
Reply

Marsh Posté le 29-11-2014 à 23:43:35    

la fermeture par `;;' du dernier motif d'un `case' est facultative.

Reply

Sujets relatifs:

Leave a Replay

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