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
相关产品推荐
相关产品推荐

