Bash脚本睡眠期间展示进度出现无限循环、sleep失效问题求助
问题分析
- while 循环逻辑错误导致无限运行:Bash 中 while 循环会持续执行
do...done块的内容,只要后面跟随的命令返回值为 0。sleep命令执行成功永远返回 0,所以你的循环没有任何终止条件,会永远运行。 - sleep 10 位置错误导致表现异常:你把
sleep 10放在了 while 的条件判断位置,脚本启动后会先静默等待 10 秒,才会第一次显示进度动画,动画只会持续 0.5 秒(5 个状态每个停留 0.1 秒),之后又进入 10 秒静默期,这就是你觉得 sleep 语句没有正常生效的原因。 - 动画显示逻辑有瑕疵:每个进度状态显示 0.1 秒后立刻清空整行,两个状态切换之间会出现空白,动画效果不连贯。
修复方案
如果你的需求是配合某个后台任务显示进度,等任务结束就自动停止进度提示,可以参考如下修改后的代码:
#!/bin/bash # 替换下面的sleep 15为你自己的耗时命令,后面加&放到后台运行 sleep 15 & # 获取后台任务的PID task_pid=$! spinner=( "Working " "Working. " "Working.. " "Working... " "Working...." ) # 循环条件改为判断后台任务是否还在运行 while kill -0 "$task_pid" 2>/dev/null do for item in "${spinner[@]}" do echo -en "\r$item" sleep .1 done done # 任务结束后清空进度行,输出结束提示 echo -en "\r \r" echo "任务执行完成"
核心修改点
- 把 while 的条件改为判断后台任务是否存活,任务结束后循环自动终止,不会无限运行
- 移除了 while 条件里的
sleep 10,动画会持续播放直到任务结束 - 把清屏操作移到了循环结束后,动画切换不会出现空白
- 数组遍历用
"${spinner[@]}"代替${spinner[*]},避免数组元素有空格时出现分词异常
内容的提问来源于stack exchange,提问作者user3819738
相关产品推荐
相关产品推荐

