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

Shell脚本进度条实现求助:如何按百分比打印进度标识?

修复你的Shell进度条脚本

嘿,我瞅了下你写的进度条脚本,现在运行起来肯定没能达到你想要的效果对吧?问题主要出在几个小细节上,我帮你修正一下,顺便解释为啥改这些地方:

原脚本的核心问题

  • 变量递增逻辑错误:counter=$counter+1这种写法在Shell里会被当成字符串拼接,导致counter变成1+1、1+1+1这类无效值,百分比计算自然全错了。
  • 百分比计算没必要调用外部工具:咱们这里都是整数运算,直接用Shell内置的算术表达式就能搞定,不用麻烦bc。
  • 输出缓冲可能导致显示滞后:Shell默认会缓冲输出,可能进度条内容不会实时显示在终端上。

修正后的完整脚本

#!/bin/bash
sleep $1 &
PID=$!
printf "["
counter=1
while kill -0 $PID 2>/dev/null; do
    # 用Shell内置算术运算计算百分比,高效又简洁
    percent_done=$((counter * 100 / $1))
    # 打印你想要的「▓+百分比」格式
    printf "▓%d" $percent_done
    # 强制刷新输出缓冲区,确保进度实时显示
    printf "%b" "\033[0K"
    sleep 1
    # Shell标准的整数自增写法
    ((counter++))
done
printf "] done!\n"

运行效果示例

当你执行myScript.sh 10时,会输出类似这样的内容:

[▓10▓20▓30▓40▓50▓60▓70▓80▓90▓100] done!

关键修改说明

  • 变量递增:把counter=$counter+1改成((counter++)),这是Shell中整数自增的标准写法,能正确让counter每次加1。
  • 百分比计算:用$((counter * 100 / $1))替代bc的调用,直接在Shell里完成整数运算,速度更快也更轻量。
  • 输出刷新:添加printf "%b" "\033[0K"强制刷新输出缓冲区,避免进度条内容等脚本结束才一次性显示。
  • 结尾换行:在done!后面加\n,让输出结束后光标自动换到新行,终端排版更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:30:59