自己写的小脚本中如果有耗时操作业务,比如网络请求,文件处理,就要考虑一下加入一个进度条来提升体验。
实现一个进度条需要解决的一些技术点:
如何在同一行实现定时刷新
定时打印使用while循环触发,代码中sleep线程休眠和i++自增长模拟,实际使用中应该封装进度值的set方法由外部控制进度。
使用格式化打印\r,保证每一次渲染都在同一行进行
如何实现终端的彩色打印
1.使用prinf或者echo -e进行格式化打印,打印字符串由类似\e[30;47m开始和\e[0m结尾。设置中\e[为固定格式,0m表示为终端默认样式,自定义样式用两位十位数标记,用;分隔,其中十位为3表示设置前景色,十位为4表示设置背景色,个位数字的意义如下表。
2.开启定时循环,设置样式个位使用i%8即可动态调整输出字符颜色。
0
1
2
3
4
5
6
7
black
red
green
yellow
blue
purple
cyan
white
loading效果
同一位置定时顺序打印"|" "/" "-" "\\",其中反斜杠\必须写成\\;同理,进度条百分号%必须写成%%
如何让进度值显示在进度条中间
1.先拼好整体打印字符串,把进度值夹在前后的空格之中。
2.使用"${totalstr:0:$i+1}"截取高亮部分,使"${totalstr:$i+1}"截取背景部分,再重新组合。
实现效果1
progress.gif
#!/bin/bash
#隐藏光标
printf "\e[?25l"
i=0;
str=""
arr=("|" "/" "-" "\\")
while [ $i -le 100 ]
do
let index=i%4
let indexcolor=i%8
let color=30+indexcolor
#打印进度
printf "\r\e[0;$color;1m[%-100s][%d%%]%c\e[0m" "$str" "$i" "${arr[$index]}"
sleep 0.1
let i++
str+='='
done
#显示光标
printf "\e[?25h""\n"
实现效果2
white_progress.gif
#!/bin/bash
#隐藏光标
printf "\e[?25l"
i=0;
str=""
bgcolor=43
space48=" "
while [ $i -le 100 ]
do
percentstr=$(printf "%3s" $i)
totalstr="${space48}${percentstr}${space48}"
leadingstr="${totalstr:0:$i+1}"
trailingstr="${totalstr:$i+1}"
#打印进度
printf "\r\e[30;47m${leadingstr}\e[37;40m${trailingstr}\e[0m"
sleep 0.05
let i++
str+="="
done
#显示光标
printf "\e[?25h""\n"
参考文章: