我的脚本接收的参数之一是以下格式的日期:yyyymmdd
。
我想检查我是否得到一个有效的日期作为输入。
我该怎么做呢?我尝试使用像这样的正则表达式:[0-9]\{\8}
你可以使用测试结构[[]]
和正则表达式匹配操作符=~
来检查字符串是否匹配正则表达式模式。
对于你的具体情况,你可以这样写:
[[ "$date" =~ ^[0-9]{8}$ ]] && echo "yes"
或者更准确的测试:
[[ "$date" =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
# |\______/\______*______/\______*__________*______/|
# | | | | |
# | | | | |
# | --year-- --month-- --day-- |
# | either 01...09 either 01..09 |
# start of line or 10,11,12 or 10..29 |
# or 30, 31 |
# end of line
也就是说,你可以在Bash中定义与你想要的格式匹配的正则表达式。你可以这样做:
[[ "$date" =~ ^regex$ ]] && echo "matched" || echo "did not match"
如果测试成功,则执行&&
后面的命令;如果测试失败,则执行||
后面的命令。
在其他shell中,可以使用grep。如果你的shell是POSIX兼容的,可以
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
需要注意的是,上述正则表达式并不完全准确,因为它没有考虑到每个月实际的天数和闰年的情况。例如,它会匹配20240230
这样的日期,尽管2月没有30日。 如果你需要更精确地匹配有效日期,可以使用如下方式做检查:
if [[ "$date" =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] ; then
if date -d "${date}" >/dev/null 2>&1 ; then
echo "Valid date"
else
echo "Invalid date"
fi
else
echo "Invalid date"
fi
彩蛋
•stackoverflow question 21112707•man date