自己寫的小腳本中如果有耗時操作業(yè)務,比如網絡請求,文件處理,就要考慮一下加入一個進度條來提升體驗。
實現一個進度條需要解決的一些技術點:
-
如何在同一行實現定時刷新
- 定時打印使用
while循環(huán)觸發(fā),代碼中sleep線程休眠和i++自增長模擬,實際使用中應該封裝進度值的set方法由外部控制進度。 - 使用格式化打印
\r,保證每一次渲染都在同一行進行
- 定時打印使用
-
如何實現終端的彩色打印
1.使用
prinf或者echo -e進行格式化打印,打印字符串由類似\e[30;47m開始和\e[0m結尾。設置中\e[為固定格式,0m表示為終端默認樣式,自定義樣式用兩位十位數標記,用;分隔,其中十位為3表示設置前景色,十位為4表示設置背景色,個位數字的意義如下表。
2.開啟定時循環(huán),設置樣式個位使用i%8即可動態(tài)調整輸出字符顏色。
| 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"