如何在Shell中实现按毫秒递增遍历时分秒毫秒格式的指定时长
实现逐毫秒迭代输出HH:MM:SS.ms格式时间的方案
核心思路
直接对时、分、秒、毫秒各维度单独写进位处理逻辑繁琐易出错,统一把起始时间转成总毫秒数做递增运算,再反向换算格式化输出即可,实现逻辑简单且兼容性强。
具体实现代码(Bash环境)
#!/bin/bash # 输入的起始时长参数 DURATION=00:14:17.82 # 1. 解析起始时间的时、分、秒、毫秒字段 IFS=':' read -r hh mm ss_ms <<< "$DURATION" IFS='.' read -r ss ms <<< "$ss_ms" # 2. 换算为总毫秒数(当前按2位毫秒处理,若需3位毫秒把所有100相关系数改为1000即可) # 前缀10#是为了避免08、09这类带前导零的数字被系统识别为八进制报错 total_ms=$((10#$hh * 3600 * 100 + 10#$mm * 60 * 100 + 10#$ss * 100 + 10#$ms)) # 3. 循环迭代,可自定义结束条件 # 示例限定循环总时长为10分钟:end_ms=$((total_ms + 10*60*100)),把while条件改为((total_ms < end_ms))即可 while true; do # 反向把总毫秒数换算回时分秒毫秒 current_ms=$((total_ms % 100)) remain_sec=$((total_ms / 100)) current_ss=$((remain_sec % 60)) remain_min=$((remain_sec / 60)) current_mm=$((remain_min % 60)) current_hh=$((remain_min / 60)) # 格式化输出,自动补前导零 printf "%02d:%02d:%02d.%02d\n" "$current_hh" "$current_mm" "$current_ss" "$current_ms" # 逐毫秒递增 total_ms=$((total_ms + 1)) # 可选:加延时模拟真实时间流逝,sleep 0.001为每1ms输出一次,不加则全速输出 # sleep 0.001 done
适配调整说明
- 若需要3位毫秒格式,把代码里所有取模、除法、换算用到的
100都改成1000,输出格式化的%02d(毫秒部分)对应改成%03d即可 - 不需要无限循环的话,提前计算终止总毫秒数,给while加上终止条件即可匹配你原示例的for循环需求
内容的提问来源于stack exchange,提问作者Ruan Matt
相关产品推荐
相关产品推荐

