【问题标题】:KornShell - Date validation in scriptKornShell - 脚本中的日期验证
【发布时间】:2009-09-04 13:49:18
【问题描述】:

我正在尝试验证仅以数字形式输入的日期(例如 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) 中。

【问题讨论】:

  • 需要在ksh中做吗?做这样的事情很常见: if echo "$TEXT" | perl -pe '测试并退出 1';然后 echo $TEXT 通过测试; fi 其中 test 是对字符串的一些有用的测试。
  • 我敢肯定,给这只猫剥皮的方法不止一种。你有 perl 中的单行正则表达式的例子吗?
  • 这取决于——你关心闰年吗?

标签: regex unix shell ksh


【解决方案1】:

this script 有帮助吗?

【讨论】:

  • 是的!这帮助我了解了 KSH 逻辑运算符 AND = -a 和 OR = -o 的语法(至少在 SH 中,不确定这些是否会延续到我的 KSH)
【解决方案2】:

好吧,如果你真的想把它作为一个单一的正则表达式来做并且你不关心闰年,试试这个:

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

【讨论】:

    【解决方案3】:

    编写一个接受日期作为参数并填写 struct tm 结构的小型 C 程序。然后使用标准 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
    

    【讨论】:

      【解决方案4】:

      致电date -d $date

      查看是否返回错误。

      【讨论】:

      • 我的“日期”不喜欢这样:>date -d 09042009 日期:-d 非法选项用法:日期 [-u] [+format] 日期 [-u] [-t [[ CC]YYMMDDhhmm[.SS] | MMDDhhmm[YY] ]
      • 哦,我没有意识到这个选项不是通用的。对于那个很抱歉。这本来很容易解决!
      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 2013-05-20
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      相关资源
      最近更新 更多