MacOS下Bash中从5分钟前开始每秒递增时间的实现问题求助
解决MacOS下基于5分钟前时间每秒递增的问题
你之前的错误核心在于:prevdate=$(date -v -5M) 存储的是可读的时间字符串(比如 Wed Oct 18 14:30:00 CST 2023),而非date命令的可执行参数。直接拼接-v +1S或+%s相当于把字符串当命令执行,自然会报command not found。
以下是两种可靠的实现方案:
方案一:基于时间戳处理(推荐,逻辑清晰)
先将5分钟前的时间转换为Unix时间戳,之后每秒对时间戳加1,再转回可读时间格式:
- 获取起始时间戳(5分钟前)
start_ts=$(date -v -5M +%s)
- 循环递增执行操作(持续递增或遍历到当前时间)
- 持续每秒递增:
current_ts=$start_ts while true; do # 转换为你需要的时间格式,默认格式或自定义(比如 +"%Y-%m-%d %H:%M:%S") current_time=$(date -r $current_ts) # 这里替换为你要执行的相关操作 echo $current_time sleep 1 current_ts=$((current_ts + 1)) done
- 遍历5分钟内的所有秒(从5分钟前到当前时间):
start_ts=$(date -v -5M +%s) end_ts=$(date +%s) for ((ts=start_ts; ts<=end_ts; ts++)); do current_time=$(date -r $ts +"%Y-%m-%d %H:%M:%S") echo $current_time # 若需要每秒执行一次,保留sleep;否则会快速遍历所有时间点 sleep 1 done
方案二:直接用date的-v参数叠加增量
不需要处理时间戳,直接让date命令基于5分钟前的时间,叠加递增的秒数:
i=0 while true; do # 直接计算5分钟前再加i秒的时间 current_time=$(date -v -5M -v +${i}S) echo $current_time # 执行你的相关操作 sleep 1 i=$((i + 1)) done
补充:若非要用prevdate变量的处理方式
如果坚持要基于已存储的prevdate字符串计算,需要用date -j参数解析字符串格式(注意格式要完全匹配date的输出):
# 将prevdate转换为时间戳 prev_ts=$(date -j -f "%a %b %d %T %Z %Y" "$prevdate" +%s) # 递增1秒 next_ts=$((prev_ts + 1)) # 转回可读时间 next_time=$(date -r $next_ts)
这种方式依赖固定的时间字符串格式,不如前两种方案稳定。
内容的提问来源于stack exchange,提问作者TheNoobCoder
相关产品推荐
相关产品推荐

