我来出shell练习题一——判断日期合法性

回复 收藏
本帖最后由 maria 于 2016-2-14 12:03 编辑

用shell脚本判断输入的日期是否合法。就是判断日期是都是真实的日期,比如20090110就是合法日期,20091332就不合法

{{{密码回复可见}}}
2016-02-05 12:11 举报
已邀请:
0

thedawn

赞同来自:

1
0

jinm

赞同来自:

学习
0

skylake_

赞同来自:

o
0

skylake_

赞同来自:

没有考虑平年和闰年啊
0

skylake_

赞同来自:

skylake_ 发表于 2016-2-5 20:35
没有考虑平年和闰年啊

看错
0

奋斗的种子

赞同来自:

看看
0

杭州小白

赞同来自:

没看懂题目{:4_99:}
0

qq495966654

赞同来自:

学习
0

soul

赞同来自:

看看
0

maria

赞同来自:

杭州小白 发表于 2016-2-6 14:10
没看懂题目

意思就是判断日期是都是真实的日期,比如20090110就是合法日期,20091332就不合法
0

wsw13640218682

赞同来自:

  1.     #!/bin/bash
  2.   
  3.    #usage:yyyymmdd
  4.   
  5.    (($#!=1))||((${#1}!=8)) && { echo "Usage:yyyymmdd";exit 1; }
  6.   
  7.    Year=${1:0:4}
  8.    Month=${1:4:2}
  9.    Day=${1:6:2}
  10.   if ! cal $Month $Year|grep -q "$Day"
  11.   then
  12.   echo error 2>/dev/null
  13.   else
  14.   echo ok
  15.   fi

0

亮亮

赞同来自:

1
0

大漠之烟

赞同来自:

{:4_91:}
0

syk

赞同来自:

本帖最后由 syk 于 2016-2-15 17:38 编辑

看看month=${datem:4:2}这个看不懂。。。
0

maria

赞同来自:

syk 发表于 2016-2-15 17:30
看看month=${datem:4:2}这个看不懂。。。

就是从第五位开始 取两位
0

HwangChen

赞同来自:

look
0

HwangChen

赞同来自:

look
0

alvinnull

赞同来自:

12
0

我是学渣

赞同来自:

{:4_99:}
0

ttly123

赞同来自:

学习
0

15012600075

赞同来自:

学习
0

北辰星

赞同来自:

学习
0

TSpace

赞同来自:

试试
0

不怕不怕

赞同来自:

学习
0

cxiaodian

赞同来自:

good
0

zyos

赞同来自:

  1. #!/bin/bash
  2. ##
  3. ##

  4. read -t30 -p "请输入一个日期: " num
  5. y=${num[@]:0:4}
  6. m=${num[@]:4:2}
  7. d=${num[@]:6:2}
  8. if [ $y -gt 2015 ]&& [ $m -le 12  ] && [ $d -le 31 ]; then

  9. echo "日期输入正确"
  10. else
  11. echo "日期输入错误"
  12. fi
0

cxiaodian

赞同来自:

本帖最后由 cxiaodian 于 2016-3-16 18:48 编辑

python
import datetime
def validate(date_text):
    try:
        datetime.datetime.strptime(date_text, '%Y%m%d')    except ValueError:   
        raise ValueError("Incorrect data format, should be YYYYMMDD")

0

木树

赞同来自:

看看!!
0

googleqicq

赞同来自:

看看
0

wangxinpeng

赞同来自:

看看

0

lerchi

赞同来自:

=1
0

lin19890913

赞同来自:

这个完全找不到思路
0

369666951

赞同来自:

看看
0

hlymlv

赞同来自:

本帖最后由 hlymlv 于 2016-3-26 20:59 编辑

类似于这种( date +%F|awk -F '-' '{print $1$2$3}'|cut -c 5-6),然后判断月份,日期 还有总体长度,年份貌似也得做个限制
0

ZHAOFUYUN

赞同来自:

1
0

rolay8

赞同来自:

思路其实很简单

  1. #!/bin/bash

  2. read -p "Please input the date! eg:2013-03-13:  " d
  3. date -d "$d" +%s >/dev/null 2>&1

  4. if [ $? -ne  0 ]
  5. then
  6.     echo "Invalid input!"
  7. else
  8.     echo "Valid Date"
  9. fi
0

Neo

赞同来自:

首先判断年,在判断月,在判断日。O了,汉语强大就强大在这。
0

落、雨寒

赞同来自:

1
0

elvis

赞同来自:

ddd
0

linux-小莫

赞同来自:

1
0

jxcia2018

赞同来自:

maria 发表于 2016-2-8 14:32
意思就是判断日期是都是真实的日期,比如20090110就是合法日期,20091332就不合法

#!/bin/bash
##
##
read -p "please input date:" a
b=`echo "$a"|awk -F "-" '{print $2}'`
c=`echo "$a"|awk -F "-" '{print $3}'`
if (($b>12))
then
echo "this is error mouth"
elif (($c>31))
then
echo "this is error days"
else echo $a
fi

比较拙劣,不知道判断的分割符是啥
0

jxcia2018

赞同来自:


没看懂 太难了吧 讲讲想法
0

jxcia2018

赞同来自:


y=${num[@]:0:4}
m=${num[@]:4:2}
d=${num[@]:6:2}
这里是什么意思?数组吗?
0

maria

赞同来自:

jxcia 发表于 2016-4-19 07:10
y=${num[@]:0:4}
m=${num[@]:4:2}
d=${num[@]:6:2}

差不多。是截取字符串的。y=${num[@]:0:4}就是从第0位开始截取4位就是年,以此类推
0

zhangyuqing

赞同来自:

jxcia 发表于 2016-4-19 07:10
y=${num[@]:0:4}
m=${num[@]:4:2}
d=${num[@]:6:2}

num是你的一个变量值 @ 代表所有 打印 num 他的所有值
0

zhangyuqing

赞同来自:

maria 发表于 2016-4-19 08:55
差不多。是截取字符串的。y=${num[@]:0:4}就是从第0位开始截取4位就是年,以此类推

:0:4}
我看不懂 这个
0

wsw13640218682

赞同来自:

jxcia 发表于 2016-4-19 07:08
没看懂 太难了吧 讲讲想法

@maria大神说了这个用法了,其实是年(4位)月(2位)日(2位),所以年份从0位开始截取4位(20xx),月份从年份的第四位那里截取2个字符(20xxxx),日从年份的第六个字符截取2位(20xxxxxx)
y=${num[@]:0:4}
m=${num[@]:4:2}
d=${num[@]:6:2}
0

zyos

赞同来自:

jxcia 发表于 2016-4-19 07:10
y=${num[@]:0:4}
m=${num[@]:4:2}
d=${num[@]:6:2}

是的
0

乐橙306

赞同来自:

1
0

ztyspar

赞同来自:

看下脚本
0

licengceng

赞同来自:

学习
0

boy461205160

赞同来自:

{:4_91:}
0

蛀牙宅

赞同来自:

{:4_92:}
0

筱影

赞同来自:

没看懂题目   {:4_97:}
0

maria

赞同来自:


{:6_137:}以你的聪明才智,我相信你看完代码之后就会看懂题目了
0

筱影

赞同来自:

maria 发表于 2016-6-3 16:18
以你的聪明才智,我相信你看完代码之后就会看懂题目了

确实。。。
0

liqiang_3902

赞同来自:

来学习一下
0

xzzlamp

赞同来自:

11
0

zjjjjy

赞同来自:

#!/bin/bash
#read -p "Please input: "

if (( $# != 1 ))
then
    echo "Wrong Number1"
else
#    echo $1 ${#1}
    if ((${#1}!=8))
    then
        echo "Wrong2"
    else
    Year=${1:0:4}
    Month=${1:4:2}
    Day=${1:6:2}
#    echo $Year$Month$Day

    if cal $Month $Year |grep -q $Day
    then        echo Ok
    else        echo Wrong
    fi
fi
fi
0

等风来

赞同来自:

学习
0

beafty

赞同来自:

学习看看...
0

monga

赞同来自:

学习
0

Toornix

赞同来自:

#!/bin/bash

y=$(($1/10000))
m=$(($1/100%100))
d=$(($1%100))

if [ $y -ge 0000 -a $y -le 9999 ]
then
        if [ $m -ge 0 -a $m -le 12 ]
        then
                if [ $d -ge 0 -a $d -le 31 ]
                then
                        echo "The date $1 is OK !!!"
                else
                        echo "The date $1 is Bad !!!"
                fi
        fi
0

tytywu

赞同来自:

111
0

jonnylin

赞同来自:

学习
0

linuxcp

赞同来自:

{:4_91:}
0

dongteng

赞同来自:

学习
0

hhao

赞同来自:

1
0

huanglin

赞同来自:

练习练习
0

hmh

赞同来自:

.
0

ryanlin

赞同来自:

看看
0

巅峰战天

赞同来自:

学习下
0

ChrisLinux

赞同来自:

没错,我就是来看答案的
0

xigua

赞同来自:

学习
0

zhangyanlong

赞同来自:

111
0

标哥

赞同来自:

rolay8 发表于 2016-3-27 22:13
思路其实很简单

你好,请问
date -d "$d" +%s

date -d "20161209"  +%s   这种写法 是什么意思?
为什么 这样 就可以判断  出来 日期的正确与否?
0

hkmaozi

赞同来自:

学习
0

kw是id

赞同来自:

#!/bin/bash
read -p "please input a real date like 20161227: " n
if [ $# -ne 1 ] || [ ${#n} -ne 8 ]
then
   echo "Usage: $0 yyyymmdd"
   exit 1
fi
y1=`date|awk '{print $NF}'`
y2=`echo $n|cut -c1,2,3,4`
m=`echo $n|cut -c5,6`
d=`echo $n|cut -c7,8`
if [ $y1 -ne $y2 ]
then
   echo "Illegal number! please input the ture year"
   exit 1
elif [ $m -gt 12 ]
then
   echo "Illegal nuumber! please input the ture month"
   exit 1
elif [ $d -gt 31 ]
then
   echo "Illegal nuumber! please input the ture day"
   exit 1
else
   echo "today is $n"
fi

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: