2009-09-04 7 views
0

J'essaie de valider une date entrée sous forme de nombres uniquement (par exemple, 09042009 au 09/04/2009).KornShell - Validation de la date dans le script

Le code vérifie maintenant la longueur de la date.

Comment est-ce que je validerais non seulement la longueur de l'entrée de date mais aussi que c'est une date réelle? Quelle serait la syntaxe pour combiner des tests et une expression régulière?

code tel qu'il existe aujourd'hui:

echo "Please enter the date you want (e.g. 07142009)" 
level=1; 
while [ $level -gt 0 ]; do 
     read date; 
     dateleng=`expr length $date` 
     if [ dateleng -ne 8 ]; then 
       echo "Bad date, please re-enter"; 
       else level=0; 
     fi 
done 

Ceci est en KornShell (ksh) sur un ancien système Unix.

+0

Avez-vous besoin de le faire dans ksh? Il est assez courant de faire des choses comme: si echo "$ TEXT" | perl -pe 'test et sortie 1'; then echo $ TEXT a passé le test; où test est un test utile de la chaîne. –

+0

Je suis sûr qu'il y a plus d'une façon de peler ce chat. Avez-vous un exemple de regex à une ligne dans perl qui le fait? – jjclarkson

+0

Cela dépend ... vous souciez-vous des années bissextiles? – Beta

Répondre

1

Est-ce que this script aide?

+0

Oui! Cela m'a aidé à voir la syntaxe pour les opérateurs logiques KSH ET = -a et OR = -o (au moins dans SH, pas sûr si ceux-ci reportent à mon KSH) – jjclarkson

-1

Appel date -d $date

Voir si elle renvoie une erreur.

+0

Ma "date" n'aime pas cela: > date -d 09042009 date: -d option illégale Utilisation: date [-u] [+ format] date [-u] [-t [[CC] YYMMDDhhmm [.SS] | MMDDhhmm [YY]] – jjclarkson

+0

Oh, je n'avais pas réalisé que cette option n'était pas universelle. Désolé pour ça. Cela aurait été une solution facile! –

1

D'accord, si vous voulez vraiment faire comme une expression régulière de flamber et que vous ne se soucient pas des années bissextiles, essayez ceci:

 
^(((0[469])|(1[1]))((0[1-9])|([12][0-9])|(30))|((0[13578])|(1[02]))((0[1-9])|([12][0-9])|(3[01]))|(02)((0[1-9])|(1[0-9])|(2[0-8])))[0-9]{4}$ 
1

écrire un petit programme C qui accepte la date comme argument et remplit une structure struct tm. Formatez ensuite la date à l'aide des routines de bibliothèque C standard et comparez-la à la chaîne de date d'entrée.

#include <time.h> 
main(int argc, char *argv[]) 
{ 
struct tm tmx, *tm2; 
    char tmbuf[9]; 
    time_t timet; 
    if (argc < 1) 
     exit(2); 
    tmx.tm_sec = tmx.tm_min = tmx.tm_hour = tmx.tm_mday = tmx.tm_mon = 
    tmx.tm_year = tmx.tm_wday = tmx.tm_yday = tmx.tm_isdst = 0; 
    tmx.tm_mon = (argv[1][0] - '0') * 10 + argv[1][1] - '0' - 1; 
    tmx.tm_mday = (argv[1][2] - '0') * 10 + argv[1][3] - '0'; 
    tmx.tm_year = atoi(&argv[1][4]) - 1900; 
    if ((timet = mktime(&tmx)) != (time_t)-1) { 
     tm2 = localtime(&timet); 
     strftime(tmbuf, sizeof(tmbuf), "%m%d%Y", tm2); 
     if (strcmp(argv[1], tmbuf) == 0) 
      exit(0); 
    } 
    exit(1); 
} 
/* 
cc valdate.c -o valdate 
*/ 

Si la date de la bibliothèque C chaîne formatée ne correspond pas à la chaîne d'entrée, la date est invalide et le programme C se termine avec un statut de 1. Sinon, la date est valide, et le statut de sortie est 0. Le script shell utilise ensuite le programme C pour valider la date.

echo "Please enter the date you want (e.g. MMDDYYYY)" 
read date 
if valdate "$date"; then 
    echo "Bad date ($date), please re-enter" 
fi 
Questions connexes