有效的Shell脚本输入日期格式

时间:2019-01-10 15:26:46

标签: linux shell

我已使用以下方法发布的方法,但仍然存在一些问题。

Validate date format in a shell script

$ ./check_date.sh 20190109
Input date format 20190109        # this should report error!

$ ./check_date.sh 2019-0109
[ERROR]: Invalid input date format 2019-0109

$ ./check_date.sh 2019-01-09
Input date format 2019-01-09

$ cat ./check_date.sh
#!/usr/bin/bash
date '+%Y-%m-%d' -d $1 > /dev/null 2>&1
if [ "$?" -ne 0 ]; then
    echo "[ERROR]: Invalid input date format $1"
    exit 1
else
    echo "Input date format $1"
fi

如您所见,我希望输入20190109会导致脚本报告错误,但可以正常运行而没有错误。

总而言之,我需要验证输入日期字符串,使其严格遵循格式YYYY-MM-DD

问题>如何使脚本按预期工作?

谢谢

1 个答案:

答案 0 :(得分:2)

以下测试应该有效:

if [[ "$1" =~ [0-9]{4}(-[0-9]{2}){2} ]] && date -d "$1" >/dev/null 2>&1; then
   success
else
   error
fi

它首先检查格式是否正确NNNN-NN-NN,然后使用date检查日期是否有效。

您的原始代码为什么不起作用:您写道:

date '+%Y-%m-%d' -d $1 > /dev/null 2>&1

您“假设”字符串'+%Y-%m-%d'定义了输入格式,但实际上定义了输出格式。 Date能够获取各种输入字符串,并进行相应的转换:

$ date -d "yesterday" '+%F'
$ date -d "2019-01-01 + 10 days" '+%F'
$ date -d "5 fortnight ago" '+%F'
$ date -d "12/13/1099" '+%F'

您不能强制日期假定输入的日期字符串具有给定的格式。