2009-09-04 19 views
0

数字のみで入力した日付の検証を試みています(たとえば、09042009を2009年9月4日としています)。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システム上でKornシェル(ksh)の場合です。

+0

あなたはkshの中でそれを行う必要がありますか?次のようなことを行うのはかなり一般的です:if echo "$ TEXT" | perl -pe 'テストとexit 1'; echo $ TEXTはテストに合格しました。 fiここで、testは文字列の有用なテストです。 –

+0

私はこの猫を肌に触れる方法は複数あると確信しています。これを行うperlで1行の正規表現の例がありますか? – jjclarkson

+0

それは、あなたがうるう年を気にしますか? – Beta

答えて

1

this scriptは役に立ちますか?

+0

はい!それはKSH論理演算子の構文を確認するために私を助け、= -aとOR = -o(少なくともSHで、これらは私のKSHに持ち越すかどうかわからない) – jjclarkson

-1

コールdate -d $date

それがエラーを返した場合に参照してください。あなたが本当に焦がす正規表現としてそれをしたいとあなたはうるう年を気にしない場合

+0

私の「日付」は、そのようにしていません。 を>日付は、-d 09042009 日:-dオプション違法 使用方法:日付[-u] [+フォーマット] 日付[-u] [-t [[CC] YYMMDDHHMM [.SS] | MMDDhhmm [YY]] – jjclarkson

+0

ああ、私はオプションが普遍的ではなかったことを認識していませんでした。申し訳ありません。それは簡単な修正でした! –

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です。 シェルスクリプトは、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