Bash脚本按分区数计算时间片时date增量表达式语法错误求助
问题原因
- 循环范围错误:你用了
seq 0 $partitions,当partitions=3时会输出0/1/2/3四个值,循环执行4次,和你需要的N=partitions次不符。 date命令的-d参数不支持直接解析算术表达式:你直接把${i}*24/$partitions这类表达式塞到-d的参数里,date无法识别运算逻辑,直接抛出语法错误。- (可选)整数运算会有精度损失:如果
partitions不能整除24,Bash自带的整数算术会截断小数部分,导致切片偏移计算不准。
解决方案
先单独计算每个切片的前后偏移小时数,再传入date命令,同时修正循环范围即可。如果需要兼容非整数的偏移量,可以用bc做浮点运算。
修正后的完整代码如下:
#!/bin/bash date=20210825 partitions=3 # 循环次数等于partitions,i从0到partitions-1 for i in $(seq 0 $((partitions - 1))); do # 先计算偏移小时数,scale=2保留两位小数兼容非整数切片 start_offset=$(echo "scale=2; $i * 24 / $partitions" | bc) stop_offset=$(echo "scale=2; ($i + 1) * 24 / $partitions" | bc) # 传入偏移量到date命令 start_time=$(date -d "${date} + ${start_offset} hour" +%H)"000" stop_time=$(date -d "${date} + ${stop_offset} hour" +%H)"000" # 可选:如果结束时间是00点,替换为24,符合单日切片的认知 if [ "$stop_time" = "00000" ]; then stop_time="24000" fi echo "切片$((i+1)): $start_time - $stop_time" done
运行后的输出结果(partitions=3时):
切片1: 00000 - 08000 切片2: 08000 - 16000 切片3: 16000 - 24000
完全符合你要的N对起止时间的需求。
内容的提问来源于stack exchange,提问作者bullfighter
相关产品推荐
相关产品推荐

