我正在 Linux 中编写 bash shell 脚本,该程序将接受 date
08-FEB-18 11.45.18.844 AM
作为参数。
我想知道是否有一种简单的方法来检查 date
time
是否有效?
最佳答案
你可以有点创意,因为你有 bash 并将日期字符串映射到一个数组中,然后可以使用 date -d
(以及另一个关联数组的帮助)轻松解析该数组。一旦日期/时间映射到数组元素并使用 date -d
转换为自纪元以来的秒数,您只需检查 date 命令的返回以确定转换是成功还是失败。适当处理返回:
#!/bin/bash
[ -n "$1" ] || { ## validate one argument given
printf "error: insufficient input\nusage: %s dd-mmm-yy hh.mm.ss.ms\n" \
"${0##*/}"
exit 1
}
oifs="$IFS" ## save original Internal Field Separator
IFS=$' \t\n-.'; ## 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 format\n"
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: %s\n" "$(date -d @$epochsec)"
fi
示例使用/输出
$ bash chkcustomdt.sh "08-FEB-18 11.45.18.844"
date: Thu Feb 8 11:45:18 CST 2018
有很多方法可以解决这个问题,这只是我想到的第一个。
关于linux - 检查参数是否是 shell 脚本中的有效日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48740814/