2009-09-04 38 views
0

我正在嘗試對輸入日期的數據進行驗證(例如09年9月9日的09042009)。KornShell - 腳本中的日期驗證

代碼現在檢查日期的長度。

我將如何驗證日期條目的長度以及它是否是實際日期?結合測試和正則表達式的語法是什麼?因爲它現在存在

代碼:

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 

這是一個老的UNIX系統上KornShell(KSH)。

+0

你需要在ksh中完成嗎?執行如下操作很常見:if echo「$ TEXT」| perl -pe'測試並退出1';然後echo $ TEXT通過測試; fi在哪裏測試是對字符串的一些有用的測試。 – 2009-09-04 14:21:17

+0

我敢肯定有不止一種方法來剝皮這隻貓。你有perl中的一行正則表達式的例子嗎? – jjclarkson 2009-09-04 14:37:22

+0

這取決於 - 你關心閏年? – Beta 2009-09-04 15:30:10

回答

1

請問this script有幫助嗎?

+0

是的!這有助於我看到KSH邏輯運算符的語法AND = -a和OR = -o(至少在SH中,不確定這些結果是否傳遞給我的KSH) – jjclarkson 2009-09-04 14:35:07

-1

呼叫date -d $date

看它是否返回一個錯誤。

+0

我的「日期」不是這樣的: > date -d 09042009 date:-d非法選項 用法:date [-u] [+ format] date [-u] [-t [[CC] YYMMDDhhmm [.SS] | MMDDhhmm [YY]] – jjclarkson 2009-09-04 14:39:48

+0

哦,我沒有意識到這個選項並不普遍。對於那個很抱歉。這將是一個簡單的解決方案! – 2009-09-04 14:58:04

1

好吧,如果你真的想這樣做,作爲一個正則表達式燒毛,你不關心閏年,試試這個:

 
^(((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

寫一個可以接受的日期作爲自變量的小的C程序並填充struct tm結構。然後使用標準C庫例程格式化日期,並將其與輸入日期字符串進行比較。

#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 
*/ 

如果C庫日期格式的字符串不等於輸入字符串,日期是 無效,C程序將與1狀態退出,否則的日期是有效的, 和退出狀態爲0. 然後shell腳本使用C程序驗證日期。

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