我正在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
有很多方法可以解决这个问题,这只是第一个想到的。