Bash脚本如何正确解析yyyy-mm、mm/yyyy等多格式日期参数
Bash多格式日期参数解析方案
问题根因
Linux/BSD自带的date命令默认要求输入必须是包含完整年月日的合法日期,仅传入年月参数时会因为缺失日字段判定为非法值,直接调用就会抛出invalid date错误。
实现逻辑
先通过正则匹配区分4种输入格式,分场景处理:
- 对仅含年月的2种格式,临时补一个合法日值(比如01)转成完整日期,解析出年、月后直接将日字段置空
- 对含完整年月日的2种格式,直接沿用原有解析逻辑即可
完整脚本(适配GNU Date,Linux环境通用)
#!/bin/bash input_date="$1" year="" month="" day="" # 匹配 yyyy-mm 格式 if [[ $input_date =~ ^[0-9]{4}-[0-9]{2}$ ]]; then full_date="${input_date}-01" year=$(date -d "$full_date" +%Y) month=$(date -d "$full_date" +%m) day="" # 匹配 mm/yyyy 格式 elif [[ $input_date =~ ^[0-9]{2}/[0-9]{4}$ ]]; then mm="${input_date%/*}" yyyy="${input_date#*/}" full_date="${mm}/01/${yyyy}" year=$(date -d "$full_date" +%Y) month=$(date -d "$full_date" +%m) day="" # 匹配 yyyy-mm-dd 格式 elif [[ $input_date =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then year=$(date -d "$input_date" +%Y) month=$(date -d "$input_date" +%m) day=$(date -d "$input_date" +%d) # 匹配 mm/dd/yy 格式 elif [[ $input_date =~ ^[0-9]{2}/[0-9]{2}/[0-9]{2}$ ]]; then year=$(date -d "$input_date" +%Y) month=$(date -d "$input_date" +%m) day=$(date -d "$input_date" +%d) else echo "不支持的日期格式" >&2 exit 1 fi # 输出结果 echo "年: $year" echo "月: $month" echo "日: $day"
macOS环境适配
macOS自带的是BSD Date,将脚本中date -d "日期值" +%输出格式类的语句,统一替换为date -j -f "输入格式" "日期值" +%输出格式即可,示例:
# yyyy-mm格式解析替换为 year=$(date -j -f "%Y-%m-%d" "$full_date" +%Y) month=$(date -j -f "%Y-%m-%d" "$full_date" +%m)
测试示例
给脚本加执行权限后直接测试:
chmod +x parse_date.sh # 测试仅年月参数 ./parse_date.sh 2024-05 # 输出: # 年: 2024 # 月: 05 # 日: ./parse_date.sh 05/2024 # 输出和上面一致 # 测试完整日期参数 ./parse_date.sh 2024-05-20 # 输出日字段为20 ./parse_date.sh 05/20/24 # 自动补全年为2024,日为20
内容的提问来源于stack exchange,提问作者craig
相关产品推荐
相关产品推荐

