Shell-case:指令碼美化(進度條、旋轉游標、逐字列印)
今天在資源中上傳了一個nginx的軟體包,裡面有nginx的安裝、升級、服務控制、優化、lnmp配置的自動化指令碼,大家可以下載使用,也可以前往我的github中檢視 https://github.com/SmartLyu/shell
不過今天還是和大家分享一個用於指令碼美觀的程式,在任何程式中都可以拿來一用,老規矩,話不多說,先上程式碼:
# 進度條 jindu(){ while : do echo -n '#' sleep 0.25 done } jindu & # 開啟進度條 kill $! # 關閉進度條 ------------------------------------------------------------- # 旋轉游標 sleep_time=0.1s # 游標旋轉間隔時間 go_start(){ dead=0 # 記錄休眠時間,當用戶未操作一段時間,可能是出現強制退出等其他特殊情況,自動退出 while [ $dead -le $1 ] # 根據不同的要求設定游標閃爍時間 do echo -e '-'"\b\c" sleep ${sleep_time}s echo -e '/'"\b\c" sleep ${sleep_time}s echo -e '|'"\b\c" sleep ${sleep_time}s echo -e '\\'"\b\c" sleep ${sleep_time}s dead=$[$dead+1] done echo -e ' '"\b\c" } go_start 10& # 1秒後自動關閉 kill $! ------------------------------------------------------------- # 逐字列印 for print_key in 要逐字列印的內容(每個字間有個空格) do echo -n $print_key sleep 0.15s done echo ''
這些可以直接套用在已經完工的程式中,例如安裝程式,並不希望使用者看到安裝過程,會選擇吧所有的輸出全部丟入黑洞,這時候又怕螢幕沒有顯示使用者會著急,就會選擇進度條來提高使用者體驗,再例如我們寫的程式對程式介紹,希望使用者認真閱讀,怕用echo瞬間顯示,會讓使用者不讀,可以用逐字列印來實現,而任何情況都可以用旋轉游標讓程式變的更炫,下面具體介紹一些這三個程式
進度條
原理很簡單,每隔0.25s輸出一個#,程式開始時開始執行,程式結束前,將其殺死,為了不阻礙程式正常執行,我們把進度條放入後臺,慢慢執行即可。
也就是說,實際上進度條和程式實際進度沒有必然聯絡,不過我們可以設定多段進度條,沒一個模組執行完結束一個進度條,然後再開啟一個,進行下一個模組,這樣可以更準確的反應程式進度,不過因為整體目的是提高使用者體驗,其實際作用就沒必要糾結了。
具體使用就是,在程式前編寫jindu函式,然後在程式正式命令前呼叫函式並放入後臺,在結束前用kill命令關閉進度條即可。
jindu(){
while :
do
echo -n '#'
sleep 0.25
done
}
jindu &
實際作用的指令碼命令
………………
…………
kill $!
echo ''
jindu &
再進行一個模組命令
kill $!
………………
旋轉游標
看上去很複雜的一個操作,讓游標這豎線可以一直旋轉,其實很簡單,通過輸出刪除在輸出的方法,具體原理就是,螢幕中輸出 | ,然後echo用\b退格,把上次打的 | 擦除,然後在其位置上寫上 \ ,然後反覆如此,讓 | \ - / 依次在一個字元位上不斷覆蓋輸出,只要有一點速度,人眼的記憶功能,就會看成動感的游標
其作用和用法和進度條很像,都是為了提高使用者體驗,也是在命令前開始,結束後關閉,不過和進度條有個不小的區別,進度條所用程式一般是安裝程式,使用者很少會人為中斷,而且人為中斷後果很大,所以,一般不用考慮進度條會沒有正常關閉,佔用命令列的可能,而旋轉游標不同,他一般是在既定了具體內容的文字列印的時候使用,而且使用者如果不耐煩,比較大概率會突然中止,這時候我們就需要考慮突然中止的問題,而具體辦法就是,在旋轉游標的函式中內建一個計時器,當到時間任然沒有中止命令,會自行中止,其用法就是
sleep_time=0.1s
go_start(){
dead=0 # 記錄休眠時間,當用戶未操作一段時間,可能是出現強制退出等其他特殊情況,自動退出
while [ $dead -le $1 ] # 根據不同的要求設定游標閃爍時間
do
echo -e '-'"\b\c"
sleep ${sleep_time}s
echo -e '/'"\b\c"
sleep ${sleep_time}s
echo -e '|'"\b\c"
sleep ${sleep_time}s
echo -e '\\'"\b\c"
sleep ${sleep_time}s
dead=$[$dead+1]
done
echo -e ' '"\b\c"
}
go_start 具體游標閃爍時間&
執行的命令
…………
kill $!
逐字列印
這是最簡單的,原理就是把一句話的每個字元拆開,用for迴圈來不斷echo出來,而每個字元echo後休眠一點時間,就會變成每個字元都是慢慢打出來的感覺
具體操作就是把想逐字列印的字串,每個字元間加個空格,然後用for迴圈打印出來就好了