IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Catcher erreur dans fonction + AWK


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut Catcher erreur dans fonction + AWK
    Bonjour;
    Je m'explique. J'ai un MAIN par lequel je fais appel à des mini-fontcions utilisant du Awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    #################
    #
    # CheckCivilite()
    # On verifie que la valeur est M ou Mme ou Mlle
    #
    CheckCivilite()
    {
             awk -F ';' '
                      $1!~/^Mme$|^M$|^Mlle$/ { print "**** ERREUR de Civilité (Champ 1) ligne:"NR"****";}
                      ' $1
      }
    #
    [...]
    #
    #MAIN 
    ########
    { 
    # On verifie la Civilité
    #
    echo "-- DEBUT -- CheckCivilite"
    CheckCivilite $FIC_ENTREE_WBLANKS
    echo "-- FIN -- CheckCivilite"
    } > ${FIC_LOG} 2>&1
    J'aimerais pouvoir déclencher un exit 1 dans le MAIN et inscrire "**** ERREUR de Civilité (Champ 1) ligne:"NR"****";} dans le fichier de log général.
    Comment faire ça ?

    Merci d'avance pour votre aide!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Bon bah j'ai mis un exit; dans le AWK puis dans la clause END j'inscris la ligne en cause de l'erreur.

    Ensuite dans le main je compte le nombre de ligne dans FLAG_ERR, si c'est superieur à 0 je fais un exit 1...

    Je pense qu'il y a beaucoup mieux à faire... mais je n'ai pas le niveau...

    Si vous savez comment catché les erreurs et renvoyé direct un exit 1 dans le main je suis preneur !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    Bonsoir,

    Tu n'es pas vraiment explicite dans ton besoin...
    mais de ce que j'en comprends, voilà quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #################
    #
    # CheckCivilite()
    # On verifie que la valeur est M ou Mme ou Mlle
    #
    CheckCivilite()
    {
             awk  ' ! /^(Mme|M|Mlle);/ { i=1; printf "**** ERREUR de Civilité (Champ 1) ligne: %d****\n", NR}
              END { exit i } ' $1 >&2
      }
    #
    [...]
    #
    #MAIN 
    ########
    { 
    # On verifie la Civilité
    #
    echo "-- DEBUT -- CheckCivilite"
    CheckCivilite $FIC_ENTREE_WBLANKS
    status=$?
    echo "-- FIN -- CheckCivilite"
    exit $status
    } > ${FIC_LOG} 2>&1
    La fonction CheckCivilite retournera le statut de awk, donc pas besoin d'effectuer un return en son sein (sauf si il y a d'autres instructions après le awk).

    Note : - ma redirection de la sortie de awk est volontaire (car il s'agit de messages d'erreur)... même si tu rediriges vers >&1 dans ton "MAIN"


    A moins que ton fichier soit vraiment volumineux, pas besoin de awk pour si peu :
    Ta fonction en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unset erreur
    while read
    do
      ((i++))
      [[ ${REPLY} =~ (Mme|M|Mlle)\;.* ]] || { 
           printf "**** ERREUR de Civilité (Champ 1) ligne: %d****\n" $i
           erreur=1
      }
    done < fichier >&2
    return $erreur
    mais ne sachant pas si tu utilises bash ou pas :
    une autre solution pour ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unset erreur
    egrep -nv '/^(Mme|M|Mlle);/' fichier | while read
    do
      erreur=1
      printf "**** ERREUR de Civilité (Champ 1) ligne: %d****\n" ${REPLY%%:*}
    done >&2
    return $erreur
    enfin bon, on peut également utiliser sed ... bref, tout outil sachant manipuler les (E)RE

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Merci chardclo pour ton aide;

    Mais en fait j'ai d'autres traitements lancés après CheckCivilite...

    En clair je voudrais que : si à la sortie d'un traitement (appel d'une procédure) il y a une erreur, on sorte de la procédure, on sorte du MAIN et on affiche l'erreur correspondante.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    Citation Envoyé par Moostiq Voir le message
    En clair je voudrais que : si à la sortie d'un traitment (appelle d'une procedure) il y a une erreur, on sorte de la procedure, on sorte du MAIN et on affiche l'erreur correspondante.
    Alors, si tu utilises bash, peut-être que les options shell -e / -E et la builtin trap peuvent t'être utiles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    set -e -E
    trap 'traitementErreur' ERR
     
    function traitementErreur()
    {
     <..traitment erreur..>
    }
     
    <...le reste du script...>
    Citation Envoyé par man bash
    set [...]
    -e
    Sortie immédiate lorsqu'une commande simple (voir GRAMMAIRE DU SHELL plus haut) se termine avec un code non nul. Le shell ne se termine pas si la commande échoue dans une boucle until ou while, dans un test if, dans une liste && ou ||, ou si le code de retour est inversé par !.
    Pour trap, je te laisse consulter ceci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur dans fonction !
    Par cincap dans le forum Débuter
    Réponses: 5
    Dernier message: 08/09/2013, 14h11
  2. Erreur dans fonction
    Par worldhugo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/06/2009, 11h29
  3. AWK, probleme de quote dans fonction awk.
    Par damien_27 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 18/03/2009, 18h51
  4. Erreur dans fonction FileTimeToLocalFileTime
    Par timotep dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/11/2007, 11h18
  5. [DEBUTANT][REGEX] erreur dans fonction
    Par TabrisLeFol dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo