You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Bash脚本:带超时与sleep的多变量for循环单行命令语法问题

灵活可复用的Shell等待循环实现

需求

需要在Shell脚本中实现等待逻辑,直至其他任务完成,且该逻辑具备高灵活性,仅修改数值即可复用。

现有代码

#! /bin/bash
for i in $(seq 1 20); do sleep 0.2; [ $i = 19 ] && echo "19" || echo $i; done

目标代码结构

期望实现类似以下结构的代码:

for i=0 iStart=1 iEnd=20 iGoal=19 iDuration=2 in $(seq $iStart $iEnd); do sleep $(echo "scale=3; $iDuration / $iEnd" | bc ); [ $i = $iGoal ] && echo "${iGoal} !!!" || echo $i; done

遇到的问题

  • 不知道如何在for循环中定义多个变量($i为计数器、$iStart为seq起始值、$iEnd为seq结束值、$iGoal为条件目标值、$iDuration为总超时秒数);
  • 不熟悉Bash脚本中的数字取整方法,需要尽可能兼容更多Bash版本;

最终实现代码

echo $(date +"%T.%N"); iStart=1; iEnd=20; iGoal=19; iDuration=2; iSleep=$(bc <<<"scale = 3; ${iDuration} / ( ${iEnd} - ${iStart} + 1 )"); for i in $(seq "$iStart" "$iEnd"); do sleep "$iSleep"; if [ "$i" -eq "$iGoal" ]; then echo "${iGoal} goal"; else echo "$i"; fi; done; echo $(date +"%T.%N")

关键细节说明

  • 把所有可配置变量(起始值、结束值、目标值、总时长)放在循环外单独定义,修改时只需调整这些数值,复用性强;
  • 用bc工具计算单次睡眠时长,通过scale=3保留三位小数,确保总等待时长接近设定的总时长;
  • 采用[ "$i" -eq "$iGoal" ]进行数值比较,避免字符串比较可能引发的异常;
  • 首尾添加时间戳输出,可直接验证总等待时长是否符合预期。

内容的提问来源于stack exchange,提问作者7three

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:33:30