1. 程式人生 > >Shell-case:指令碼美化(進度條、旋轉游標、逐字列印)

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迴圈打印出來就好了