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

Linux Discussion :

vérifier le format date heure en shell (ksh)


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut vérifier le format date heure en shell (ksh)
    Bonjour!

    Je dois vérifier la valeur d'une variable saisie par l'utilisateur.

    format: DD/MM/YYYY HH:MM:SS

    J'ai tenté ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    echo $DHM | grep "[0-9]/[0-9]/[0-9] [0-9]:[0-9]:[0-9]" >/dev/null 2>&1 
    if [ $? -eq 0 ] 
    then
    	echo "yep"
    else
    	echo "nop"
    fi
    Cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    b=`expr match "$DHM" '\([0-9]/[0-9]/[0-9] [0-9]:[0-9]:[0-9]\)'` 
    if [ "$DHM" != "$b" ]
    then
    	echo "pas ok"
    else
    	echo "ok"
    fi
    Sans succès! Le problème vient sûrement de la définition de mon expression régulière...

    Sinon d'après mes recherches ce serait possible avec sed et/ou grep mais je n'ai pas trouvé d'exemple très clair.

    Merci de votre aide!

    Susu39.

  2. #2
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep -q [0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]"
    semble plus coller à ce que tu veux matcher il me semble
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut test
    J'ai testé comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    echo "DHM panne [$DHM_PANNE] (DD/MM/YYYY HH:MM:SS) : \c"
    read DHM
    echo $DHM | grep -q "[0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]" >/dev/null 2>&1 
    if [ $? -eq 0 ] 
    then
    	echo "yep"
    else
    	echo "nop"
    fi
    En saisissant une valeur qui devrait être valide (01/01/2000 15:15:20 par exemple), j'affiche "nop".
    Y aurait-il une erreur dans mon test?

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    parce que c'est une ER exacte et que tu as mis 2000 alors que l'ER spécifie ".../[0-9][0-9] "[0-9][0-9]:...." : 2 nombres suivis d'un espace suivis de deux nombres suivis de :. Et toi tu as mis 4 nombres (le "2000"). Donc adapte en fonction:
    [0-9][0-9]/[0-9][0-9]/[0-9]\{4\}
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    ok! J'ai modifié un peu l'expression pour que ça corresponde plus à une date heure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    echo $DHM | grep -q "[0-3][0-9]/[0-1][0-9]/[0-9]\{4\} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]" >/dev/null 2>&1 
    if [ $? -eq 0 ] 
    then
    	echo "yep"
    else
    	echo "nop"
    fi
    Par contre on peut toujours saisir 39/19/9999 29:59:59 et ça passe
    Je regarde pour des tests supplémentaires (avec cut -f -d) à moins que l'expression soit encore "optimisable"

    Merci pour toutes ces réponses!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Voilà le code final, une procédure de vérification :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    ETAPE_DHM(){
    read DHM
    typeset -i DHM_OK
    DHM_OK=0
    typeset -i valeur
    typeset -i valeur2
    echo $DHM | grep -q "[0-3][0-9]/[0-1][0-9]/[0-9]\{4\} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]" >/dev/null 2>&1
    if [ $DHM_OK -ne 1 ]
    then
    	if [ $? -eq 0 ]
    	then
    		#test du jour
    		valeur=`echo $DHM|cut -f 1 -d/`
    		if [  $valeur -gt 0 -o $valeur -le 31 ]
    		then
    			#test du mois
    			valeur=`echo $DHM|cut -f 2 -d/`	
    			if [ $valeur -gt 0 -a $valeur -le 12 ]
    			then
    				#test de l'année
    				valeur=`echo $DHM|cut -f 3 -d/|cut -c-4`
    				valeur2=`date "+%Y"`
    				if [ $valeur -le $valeur2 ]
    				then
    					#test de l'heure
    					valeur=`echo $DHM|cut -f 1 -d:|cut -f 2 -d' '`
    					if [ $valeur -gt 0 -a $valeur -le 23 ]
    					then
    						#test des minutes
    						valeur=`echo $DHM|cut -f 2 -d:`
    						if [ $valeur -ge 0 -a $valeur -le 59 ]
    						then
    							#test des secondes
    							valeur=`echo $DHM|cut -f 3 -d:`
    							if [ $valeur -ge 0 -a $valeur -le 59 ]
    							then
    								echo "ok"
    								DHM_OK=1
    							fi
    						fi
    					fi
    				fi
    			fi
    		fi
    	fi
    fi
    if [ $DHM_OK -ne 1 ]
    then
    	echo "Cette date/heure est invalide. Veuillez recommencer!"
    	ETAPE_DHM
    fi
    }
    Susu39.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par susu39 Voir le message
    Voilà le code final, une procédure de vérification :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    ETAPE_DHM(){
    read DHM
    typeset -i DHM_OK
    DHM_OK=0
    typeset -i valeur
    typeset -i valeur2
    echo $DHM | grep -q "[0-3][0-9]/[0-1][0-9]/[0-9]\{4\} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]" >/dev/null 2>&1
    if [ $DHM_OK -ne 1 ]
    then
    	if [ $? -eq 0 ]
    	then
    		#test du jour
    		valeur=`echo $DHM|cut -f 1 -d/`
    		if [  $valeur -gt 0 -o $valeur -le 31 ]
    		then
    			#test du mois
    			valeur=`echo $DHM|cut -f 2 -d/`	
    			if [ $valeur -gt 0 -a $valeur -le 12 ]
    			then
    				#test de l'année
    				valeur=`echo $DHM|cut -f 3 -d/|cut -c-4`
    				valeur2=`date "+%Y"`
    				if [ $valeur -le $valeur2 ]
    				then
    					#test de l'heure
    					valeur=`echo $DHM|cut -f 1 -d:|cut -f 2 -d' '`
    					if [ $valeur -gt 0 -a $valeur -le 23 ]
    					then
    						#test des minutes
    						valeur=`echo $DHM|cut -f 2 -d:`
    						if [ $valeur -ge 0 -a $valeur -le 59 ]
    						then
    							#test des secondes
    							valeur=`echo $DHM|cut -f 3 -d:`
    							if [ $valeur -ge 0 -a $valeur -le 59 ]
    							then
    								echo "ok"
    								DHM_OK=1
    							fi
    						fi
    					fi
    				fi
    			fi
    		fi
    	fi
    fi
    if [ $DHM_OK -ne 1 ]
    then
    	echo "Cette date/heure est invalide. Veuillez recommencer!"
    	ETAPE_DHM
    fi
    }
    Susu39.
    Jpige pas trop pourquoi tu mets DHM_OK à 0 pour tester juste en dessous qu'il n'est pas égal à 1 (test toujours vrai). En revanche, la procédure
    grep ... 1>/dev/null 2>&1
    if test $? -eq 0
    peut se réduire. Déjà, grep ne renvoie une erreur que s'il est mal écrit donc le 2>&1 est inutile. De plus, puisque le if permet de tester une commande, autant lui faire tester directement le grep

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ $DHM_OK -ne 1 ]
    then
    	if echo $DHM | grep -q "[0-3][0-9]/[0-1][0-9]/[0-9]\{4\} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]" >/dev/null
               ...
    Attention aussi aux portées des varaibles. Une variable dans une fonction n'est pas locale à la fonction. Autrement dit, si jamais dans ton code tu utilises la variable "valeur" et que tu appelles la fonction, celle-ci écrase celle de ton code.
    Pour rendre une variable locale, soit tu utilises le mot clef "local", soit tu isoles le bloc qui l'utilise par des parenthèses
    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
    ETAPE_DHM()
    {
    	( # <--- ICI
    		read DHM
    		typeset -i DHM_OK
    		DHM_OK=0
    		typeset -i valeur
    		typeset -i valeur2
     
    		if [ $DHM_OK -ne 1 ]
    		then
    			if echo $DHM | grep -q "[0-3][0-9]/[0-1][0-9]/[0-9]\{4\}   [0-2][0-9]:[0-5][0-9]:[0-5][0-9]" >/dev/null
    			then
    				#test du jour
    				...
    			fi
    		fi
    	) # <--- ET LA !!!
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci pour ces remarques!

    En fait j'ai enlevé une partie du code (où je donne une valeur par défaut dans certains cas, et donc je mets DHM_OK à 1 pour ne pas faire les tests suivants) pour montrer les tests de vérif en particulier, c'est pour ça que l'utilisation de DHM_OK paraît inutile.

  9. #9
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Gestion d'erreur
    Bonjour je debute en shell script et j'aimerai savoir si vous pouviez m'indiquer quelques astuce pour faire une bonne gestion d'erreur. Quels sont les commandes les plus utiliser? Je suis sous ksh merci d'avance.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pti_Dev Voir le message
    Bonjour je debute en shell script et j'aimerai savoir si vous pouviez m'indiquer quelques astuce pour faire une bonne gestion d'erreur. Quels sont les commandes les plus utiliser? Je suis sous ksh merci d'avance.
    La seule gestion d'erreur possible en shell est d'utiliser la variable "$?". A chaque fois qu'un programme est exécuté, la variable reçoit le statut final du programme sous forme de valeur numérique
    0 => programme bien exécutée
    pas 0 => le programme a été interrompu pour une raison X ou Y et n'a pas bien fonctionné

    Bien entendu ce mécanisme suppose un partenariat de la part du programme. Il faut que celui-ci soit codé pour renvoyer son code d'état à l'appelant (le shell) et que ce code corresponde à la convention ci-dessus. Par exemple le programme "expr" ne respecte pas parfaitement cette convention car son fonctionnement est le suivant
    - quand expr se déroule correctement et qu'il affiche (à l'écran) une valeur différente de 0, alors son code retour est à 0
    - quand expr se déroule correctement et qu'il affiche (à l'écran) la valeur 0, alors son code retour est à 1
    - si expr ne se déroule pas correctement alors son code retour est à 2
    Et donc si t'appelles expr et que tu regardes ensuite la valeur de "$?" et que tu vois "1", tu pourrais penser qu'il s'est mal déroulé alors que ce n'est pas le cas.
    Donc si tu veux bien faire une gestion d'erreur pour les programmes que t'appelles, faut que tu examines bien la doc du programme en question pour savoir gérer son code retour.

    PS: Quand on n'est pas l'auteur d'un topic et qu'on pose une question nouvelle, on ouvre un topic neuf et on ne squate pas les topic des autres.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Format Date heure
    Par wissem.ba dans le forum SQL
    Réponses: 1
    Dernier message: 14/03/2011, 12h48
  2. [XL-2003] problème format DATE HEURE
    Par benoi dans le forum Excel
    Réponses: 3
    Dernier message: 14/09/2009, 14h05
  3. format date/heure dans le code
    Par Invité dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/10/2007, 20h24
  4. utiliser un format "date heure" dans une formule
    Par Tonton Phil dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/08/2007, 14h37
  5. format date/heure et concaténation
    Par Waluigi dans le forum Access
    Réponses: 3
    Dernier message: 02/06/2006, 11h25

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