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

Vue hybride

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    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 chevronné 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
    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

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    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 chevronné 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
    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\}

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    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.

+ 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