Bash脚本验证用户输入的dd/mm/yyyy格式日期问题
验证DD/MM/YYYY格式有效日期的Bash脚本方案
问题背景
需要验证脚本传入的唯一参数是否为DD/MM/YYYY格式的有效日期(如13/01/2022):
- 正则表达式仅能匹配格式,无法验证日期有效性(比如
29/02/2023这类无效日期无法识别); - 直接使用
date -d "$1" '+%d/%m/%Y'验证时,date命令默认解析逻辑不识别DD/MM/YYYY格式,会将其误判为MM/DD/YYYY,导致合法日期被判定无效(如13/01/2022会因13不是合法月份报错)。
解决方案
方案1:适配GNU Date(Linux系统)
GNU Date默认不直接支持DD/MM/YYYY解析,但可通过替换日期分隔符,转为date可识别的格式后再验证:
datestr="$1" # 将斜杠替换为横杠,转为DD-MM-YYYY格式供date解析 if [[ "$datestr" == $(date -d "${datestr//\//-}" '+%d/%m/%Y' 2>/dev/null) ]]; then echo "Valid date" else echo "Invalid date" fi
- 说明:
${datestr//\//-}将所有/替换为-;2>/dev/null屏蔽解析无效日期时的错误输出;对比原字符串与date解析后回显的DD/MM/YYYY格式字符串,一致则为有效日期。
方案2:适配BSD Date(macOS等系统)
BSD Date支持通过-f参数直接指定输入日期格式,无需转换分隔符:
datestr="$1" if [[ "$datestr" == $(date -j -f "%d/%m/%Y" "$datestr" "+%d/%m/%Y" 2>/dev/null) ]]; then echo "Valid date" else echo "Invalid date" fi
- 说明:
-j表示不修改系统时间;-f "%d/%m/%Y"指定输入日期格式为DD/MM/YYYY;通过原字符串与输出格式的一致性验证有效性。
补充:结合正则做前置格式校验
为减少无效格式的解析开销,可先通过正则初步过滤格式,再执行日期有效性验证(以GNU Date为例):
datestr="$1" # 正则匹配DD/MM/YYYY格式(初步过滤) if [[ "$datestr" =~ ^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$ ]]; then # 执行日期有效性验证 if [[ "$datestr" == $(date -d "${datestr//\//-}" '+%d/%m/%Y' 2>/dev/null) ]]; then echo "Valid date" else echo "Invalid date" fi else echo "Invalid format (must be DD/MM/YYYY)" fi
内容的提问来源于stack exchange,提问作者Sevs
相关产品推荐
相关产品推荐

