我已经使用了针对以下问题发布的方法,但我仍然遇到一些问题。
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
会导致脚本报告 ERROR,但它可以正常运行。
总而言之,我需要验证输入的日期字符串,使其严格遵循格式YYYY-MM-DD
。
问题>我应该怎么做才能让脚本按预期工作?
谢谢
最佳答案
以下测试应该有效:
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'
您不能强制日期假定输入的日期字符串具有给定的格式。
关于linux - 有效的 shell 脚本输入日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54131898/