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

