自己写的小脚本中如果有耗时操作业务,比如网络请求,文件处理,就要考虑一下加入一个进度条来提升体验。
实现一个进度条需要解决的一些技术点:
-
如何在同一行实现定时刷新
- 定时打印使用
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
#!/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
#!/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"