Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 16h31   #1
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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 :
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!
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 17h04   #2
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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 !
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 19h13   #3
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Bonsoir,

Tu n'es pas vraiment explicite dans ton besoin...
mais de ce que j'en comprends, voilà quelque chose :
Code :
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 :
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 :
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
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/09/2011, 11h40   #4
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 109
Points : 33
Points : 33
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.
Moostiq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 11h57   #5
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
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 :
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
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h07.


 
 
 
 
Partenaires

Hébergement Web