检查参数是否是Shell脚本中的有效日期时间



我正在Linux中编写bash shell脚本,该程序将接受 date 08-FEB-18 11.45.18.844 AM作为参数。

我想知道是否有一种简单的方法可以检查date time是否有效?

您可以获得一些创意,因为您有bash并将日期字符串映射到一个数组中,然后可以用date -d轻松解析(以及另一个关联数组的帮助(。一旦将日期/时间映射到数组元素并自date -d时期以来转换为秒,您只需检查日期命令的返回即可确定转换是成功还是失败。适当处理退货:

#!/bin/bash
[ -n "$1" ] || {    ## validate one argument given
    printf "error: insufficient inputnusage: %s dd-mmm-yy hh.mm.ss.msn" 
    "${0##*/}"
    exit 1
}
oifs="$IFS"         ## save original Internal Field Separator
IFS=$' tn-.';     ## set IFS to break on - or .
dt=( $(echo $1) )   ## separate date into indexed array
[ "${#dt[@]}" -lt '7' ] && {    ## check all 7 components present
    printf "error: date doesn't match dd-mmm-yy hh.mm.ss.ms formatn"
    exit 1
}
IFS="$oifs"         ## reset original IFS
## create associative array mapping months to numerics
declare -A mo=(
    [JAN]=1
    [FEB]=2
    [MAR]=3
    [APR]=4
    [MAY]=5
    [JUN]=6
    [JUL]=7
    [AUG]=8
    [SEP]=9
    [OCT]=10
    [NOV]=11
    [DEC]=12
)
## any date after 30 considerd 1930, else considered 2000
[ "${dt[2]}" -gt '30' ] && dt[2]=$((${dt[2]} + 1000)) || 
dt[2]=$((${dt[2]} + 2000))
## use date to convert array contents to seconds since epoch
epochsec=$( date -d "${dt[2]}-${mo[${dt[1]}]}-${dt[0]} 
                    ${dt[3]}:${dt[4]}:${dt[5]}.${dt[6]}" +%s )
if [ "$?" -ne '0' ]; then   ## check if last return was error
    printf "error: invalid date.n"
else    ## output good date
    printf "date: %sn" "$(date -d @$epochsec)"
fi

示例使用/输出

$ bash chkcustomdt.sh "08-FEB-18 11.45.18.844"
date: Thu Feb  8 11:45:18 CST 2018

有很多方法可以解决这个问题,这只是第一个想到的。

最新更新