如何使用Shell脚本拆分多分隔符时间字符串并转换为总秒数
自定义时间字符串转总秒数Shell脚本实现
前置说明
脚本默认采用换算规则:1年=365天、1月=30天,如有特殊换算需求可直接修改脚本内的单位系数即可。
完整脚本代码
#!/bin/bash # 各单位对应的秒数系数,可按需调整 Y_SEC=$((365 * 24 * 3600)) MT_SEC=$((30 * 24 * 3600)) D_SEC=$((24 * 3600)) H_SEC=3600 M_SEC=60 S_SEC=1 # 入参校验 if [ $# -ne 1 ]; then echo "用法:$0 <时间字符串>" exit 1 fi time_str="$1" total_sec=0 # 依次提取各单位数值累加(支持同单位多值叠加) # 提取年 for val in $(grep -oE '[0-9]+Y' <<< "$time_str" | sed 's/Y//'); do total_sec=$((total_sec + val * Y_SEC)) done # 提取月 for val in $(grep -oE '[0-9]+MT' <<< "$time_str" | sed 's/MT//'); do total_sec=$((total_sec + val * MT_SEC)) done # 提取天 for val in $(grep -oE '[0-9]+D' <<< "$time_str" | sed 's/D//'); do total_sec=$((total_sec + val * D_SEC)) done # 提取小时 for val in $(grep -oE '[0-9]+H' <<< "$time_str" | sed 's/H//'); do total_sec=$((total_sec + val * H_SEC)) done # 提取分钟 for val in $(grep -oE '[0-9]+M' <<< "$time_str" | sed 's/M//'); do total_sec=$((total_sec + val * M_SEC)) done # 提取秒 for val in $(grep -oE '[0-9]+S' <<< "$time_str" | sed 's/S//'); do total_sec=$((total_sec + val * S_SEC)) done echo "$total_sec"
使用方法
- 保存上述代码为
time2sec.sh,给文件添加执行权限:
chmod +x time2sec.sh
- 直接传入时间字符串运行即可,示例运行结果:
./time2sec.sh 1H20S→ 输出3620./time2sec.sh 10M200S→ 输出800./time2sec.sh 10M100S→ 输出700./time2sec.sh 1Y2MT3D4H5H6S→ 输出36892806
特性说明
- 支持同单位多值自动累加,符合题目给出的不规则字符串格式要求
- 单位匹配不会出现混淆,优先匹配长单位
MT再匹配短单位M,不会误识别 - 兼容所有符合题目规则的输入格式
内容的提问来源于stack exchange,提问作者ranjith soma
相关产品推荐
相关产品推荐

