我已使用以下方法发布的方法,但仍然存在一些问题。
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
。
问题>如何使脚本按预期工作?
谢谢
答案 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'
您不能强制日期假定输入的日期字符串具有给定的格式。