linux shell实现转换输入日期的格式
对于用户输入日期的合法性检验,是个很重要的问题,这个例子是简单得取得用户输入的日期,并转换为相应的格式,但不完美,原因请看后文。
#!/bin/sh #normdate--Normalizesmonthfieldindatespecification #tothreeletters,firstlettercapitalized.Ahelper #functionforScript#7,valid-date.Exitsw/zeroifnoerror. monthnoToName() { #Setsthevariable'month'totheappropriatevalue case$1in 1)month="Jan";;2)month="Feb";; 3)month="Mar";;4)month="Apr";; 5)month="May";;6)month="Jun";; 7)month="Jul";;8)month="Aug";; 9)month="Sep";;10)month="Oct";; 11)month="Nov";;12)month="Dec";; *)echo"$0:Unknownnumericmonthvalue$1">&2;exit1 esac return0 } ##Beginmainscript if[$#-ne3];then echo"Usage:$0monthdayyear">&2 echo"TypicalinputformatsareAugust31962and832002">&2 exit1 fi if[$3-lt99];then echo"$0:expectedfour-digityearvalue.">&2;exit1 fi if[-z$(echo$1|sed's/[[:digit:]]//g')];then monthnoToName$1 else #Normalizetofirstthreeletters,firstupper,restlowercase month="$(echo$1|cut-c1|tr'[:lower:]''[:upper:]')" month="$month$(echo$1|cut-c2-3|tr'[:upper:]''[:lower:]')" fi echo$month$2$3 exit0
脚本分析:
1)定义了函数monthnoToName(),用来转换用户输入的数字月份
2)首先判断参数的个数是否为3个,其次判断年份,接着是转换月份格式。
3)if[-z$(echo$1|sed's/[[:digit:]]//g')];这句话有点意思,是如果$1被执行sed替换的话,即$1中存在数字
则执行函数monthnoToName(),来转换数字月份。
4)month="$(echo$1|cut-c1|tr'[:lower:]''[:upper:]')"
month="$month$(echo$1|cut-c2-3|tr'[:upper:]''[:lower:]')"
将输入的字符月份转换为标准格式。
5)这个脚本最大的缺陷是虽然将日期的格式转换了,但不能检测过滤不存在的日期。