跪求代码:shell中判断输入的日期是否合法,格式为(yyyy-mm-dd)

时间:2022-03-01 04:50:30
初学shell,现在需完成一个程序。判断输入的日期是否符合yyyy-mm-dd格式。
请各位大牛帮帮忙

15 个解决方案

#1


比如你存日期的字符串是datestr

if echo $datestr | grep -q "-" && date -d  $datestr +%Y%m%d
then 
    "ok,the date format is yyyy-mm-dd"
fi

#2


上面那个 如果不符合日期格式会输出错误信息  我们把错误信息屏蔽掉

if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
then 
  "ok,the date format is yyyy-mm-dd"
fi

#3


我需要判断yyyy,mm,dd是否是数字啊

#4


引用 3 楼 zhaojingtt 的回复:
我需要判断yyyy,mm,dd是否是数字啊

是数字就一定是合法的yyyy-mm-dd?!

我上面那个不但判断是不是yyyy-mm-dd格式 还会用date命令来判断数字是不是合法的日期!

你自己测试一下 好不好?

#5


2010-10-40
这是合法日期吗!明显不是!

#6


谢谢啊。初学者,不怎么懂啊。
我的任务是判断是输入一个日期yyyy-mm-dd判断yyyy年的mm月有多少天,所以就得先判断输入的格式。
谢谢啊,我看shell才4天,所以很多地方都不懂,多多包含

#7


对呀! 我那个就是判断格式对不对啊 日期是否合法啊  
如果合法了 你就开始处理就行了啊!

if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
then 
   这里说明日期已经合法了
   分别去判断年也好 月也好 日期也好 在这里写代码就行了
else
   echo "你输入的日期不合法"
fi

#8


多谢多谢啊,我为这个愁了一天了。。。

#9


#!/bin/ksh
vdate()
{
        [[ "$1" = @([0-9][0-9][0-9][0-9])-@([0-9][0-9])-@([0-9][0-9]) ]] || { echo nn; return 1; }

        integer yy mm dd
        echo "$1" | IFS=- read yy mm dd
        echo $mm $yy $dd
        (cal $mm $yy | grep -q $dd && echo ok || echo fail) 2>&-
}

上面是一个检查日期是否合法的函数
lz可以自己验证一下
vdate 2010-01-02
vdate 2010-01-92

#10


马克~~  并看看自己的头像

#11


if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
这个不对啊,输入2010-12--1也是可以的,显然不合法啊

#12


引用 11 楼 zhaojingtt 的回复:
if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
这个不对啊,输入2010-12--1也是可以的,显然不合法啊

那就改下咯  有问题 尝试自己去完善嘛 
if echo $datestr | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d 2>/dev/null

#13


我是为了完成任务啊,最近工作忙死了,没有时间去研究这个,主要是刚接触不怎么懂,就想快点搞出来。

if echo $datestr | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d 2>/dev/null
这样写会输出日期,能不不要输出啊

#14


引用 13 楼 zhaojingtt 的回复:
我是为了完成任务啊,最近工作忙死了,没有时间去研究这个,主要是刚接触不怎么懂,就想快点搞出来。

if echo $datestr | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d 2>/dev/null
这样写会输出日期,能不不要输出啊

if echo $datestr |grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d >/dev/null 2>&1

需要注意的是 现在月份和日期必须输入2位才合法 2010-9-9会认为不合法 要写成2010-09-09
如果你要2010-9-9也合法 那如下改写
if echo $datestr |grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $datestr +%Y%m%d >/dev/null 2>&1

#15


谢谢啊。我就需要2010-09-09是合法的,2010-9-9是非法的。
我现在需要在输入日期不合法的情况下重复输入3次才退出,请大牛帮忙一下。万分感激啊。

#1


比如你存日期的字符串是datestr

if echo $datestr | grep -q "-" && date -d  $datestr +%Y%m%d
then 
    "ok,the date format is yyyy-mm-dd"
fi

#2


上面那个 如果不符合日期格式会输出错误信息  我们把错误信息屏蔽掉

if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
then 
  "ok,the date format is yyyy-mm-dd"
fi

#3


我需要判断yyyy,mm,dd是否是数字啊

#4


引用 3 楼 zhaojingtt 的回复:
我需要判断yyyy,mm,dd是否是数字啊

是数字就一定是合法的yyyy-mm-dd?!

我上面那个不但判断是不是yyyy-mm-dd格式 还会用date命令来判断数字是不是合法的日期!

你自己测试一下 好不好?

#5


2010-10-40
这是合法日期吗!明显不是!

#6


谢谢啊。初学者,不怎么懂啊。
我的任务是判断是输入一个日期yyyy-mm-dd判断yyyy年的mm月有多少天,所以就得先判断输入的格式。
谢谢啊,我看shell才4天,所以很多地方都不懂,多多包含

#7


对呀! 我那个就是判断格式对不对啊 日期是否合法啊  
如果合法了 你就开始处理就行了啊!

if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
then 
   这里说明日期已经合法了
   分别去判断年也好 月也好 日期也好 在这里写代码就行了
else
   echo "你输入的日期不合法"
fi

#8


多谢多谢啊,我为这个愁了一天了。。。

#9


#!/bin/ksh
vdate()
{
        [[ "$1" = @([0-9][0-9][0-9][0-9])-@([0-9][0-9])-@([0-9][0-9]) ]] || { echo nn; return 1; }

        integer yy mm dd
        echo "$1" | IFS=- read yy mm dd
        echo $mm $yy $dd
        (cal $mm $yy | grep -q $dd && echo ok || echo fail) 2>&-
}

上面是一个检查日期是否合法的函数
lz可以自己验证一下
vdate 2010-01-02
vdate 2010-01-92

#10


马克~~  并看看自己的头像

#11


if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
这个不对啊,输入2010-12--1也是可以的,显然不合法啊

#12


引用 11 楼 zhaojingtt 的回复:
if echo $datestr | grep -q "-" && date -d $datestr +%Y%m%d 2>/dev/null
这个不对啊,输入2010-12--1也是可以的,显然不合法啊

那就改下咯  有问题 尝试自己去完善嘛 
if echo $datestr | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d 2>/dev/null

#13


我是为了完成任务啊,最近工作忙死了,没有时间去研究这个,主要是刚接触不怎么懂,就想快点搞出来。

if echo $datestr | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d 2>/dev/null
这样写会输出日期,能不不要输出啊

#14


引用 13 楼 zhaojingtt 的回复:
我是为了完成任务啊,最近工作忙死了,没有时间去研究这个,主要是刚接触不怎么懂,就想快点搞出来。

if echo $datestr | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d 2>/dev/null
这样写会输出日期,能不不要输出啊

if echo $datestr |grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" && date -d $datestr +%Y%m%d >/dev/null 2>&1

需要注意的是 现在月份和日期必须输入2位才合法 2010-9-9会认为不合法 要写成2010-09-09
如果你要2010-9-9也合法 那如下改写
if echo $datestr |grep -Eq "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}" && date -d $datestr +%Y%m%d >/dev/null 2>&1

#15


谢谢啊。我就需要2010-09-09是合法的,2010-9-9是非法的。
我现在需要在输入日期不合法的情况下重复输入3次才退出,请大牛帮忙一下。万分感激啊。