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

标签 linux bash shell

我正在 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/

相关文章:

c - 编写程序以处理导致 Linux 上丢失写入的 I/O 错误

bash - perl 执行一个输入来自 <(cmd2 input) 的命令

java - 如何从命令行(使用 kotlinc)使用 kapt?

linux - Shell脚本创建linux用户帐户但密码错误

r - loop_apply.o : file not recognized: File format not recognized

c - 它正在录制,但录制的视频无法播放。它给出错误 "moov data not found",请帮我解决这个问题

c - 查询完整 DNS 记录

linux - 电子邮件中的所有行一起运行

linux - 我可以从 ssh 命令获得某种类型的返回值吗?

bash - 将stdout和stderr捕获到不同的变量中