我正在尝试验证仅作为数字输入的日期(例如,09042009为09/04/2009)。
代码现在检查日期的长度。
我如何不仅验证日期条目的长度,还要验证它是真实的日期?组合测试和正则表达式的语法是什么?
现在存在的代码:
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 :(得分:1)
this script有帮助吗?
答案 1 :(得分: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}$
答案 2 :(得分: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
答案 3 :(得分:-1)
致电date -d $date
查看是否返回错误。