程式執行時的進度顯示

    說明

    當開發 SHELL 時,遇到需執行較久的程式段,可以參考此篇範例,在等待程式結束前使終端機有個小動畫,用來表示程式執行中。

    讓自己寫的 SHELL Script 比別人酷炫多了。

    範例一:顯示進度條

    reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)

    以下是我參考的文章:

    使用Unix的朋友們恐怕都對Linux中加載內核時的"Loading Vmlinuz………..",或BSD boot時旋轉的衛星小信號映像頗深,其實我們也可以在自己的腳本中模擬這樣的動態進度條。使用下面兩個腳本的模式,替換程序主體為你自己的腳本。雖然有少許缺陷,但是一樣有不小的樂趣哦。

    程序1:模擬Linux loading kernel

    #####################################################################
    #!/bin/sh
    #輸出"."進度條函數,兼容bsh、ksh、bash
    #首先trap 1 2 3 15信號,重要

    trap 'kill $BG_PID;echo;exit' 1 2 3 15

    function dots
    {
    stty -echo >/dev/null 2>&1
    while true
    do
      echo ".c"
      sleep 1 
    done
    stty echo
    echo
    }

    #———————————————
    # 主程序開始
    #———————————————

    #首先使dots函數後台運行
    dots &
    BG_PID=$!

    #開始程序主體,本例中執行休眠10秒
    #注意必要時使用 >/dev/null 2>&1關閉輸出和錯誤回顯,避免破壞顯示
    sleep 10

    #程序結尾注意kill dots,否則dots會一直執行
    kill $BG_PID

    #####################################################################

    程序2:模擬FreeBSD loading kernel

    #####################################################################
    #!/bin/sh
    #輸出"*"進度條函數,兼容bsh、ksh、bash
    #首先trap 1 2 3 15信號,重要

    trap 'kill $BG_PID;echo;exit' 1 2 3 15

    function rotate
    {
    INTERVAL=0.1         #進度條旋轉時間0.1秒,注意並不是所有系統都支持非整數
    TCOUNT="0"                
    stty -echo >/dev/null 2>&1
    while :
    do
    TCOUNT=`expr $TCOUNT + 1`
       case $TCOUNT in
       "1") echo '-'" c"
       sleep $INTERVAL
       ;;
       "2") echo ''" c"
       sleep $INTERVAL
       ;;
       "3") echo "| c"
       sleep $INTERVAL
       ;;
       "4") echo "/ c"
       sleep $INTERVAL
       ;;
       *) TCOUNT="0" ;;
       esac
    done
    stty echo
    }

    #———————————————
    # 主程序開始
    #———————————————

    #首先使rotate函數後台運行
    rotate &
    ROTATE_PID=$!

    #開始程序主體,本例中執行休眠10秒
    #注意必要時使用 >/dev/null 2>&1關閉輸出和錯誤回顯,避免破壞顯示
    sleep 10

    #程序結尾注意kill dots,否則dots會一直執行;清除多餘字符
    kill -9 $ROTATE_PID
    echo "  "

    ###############################################################

    範例二:整合 LED 的顯示

    reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)

    TIPs:

    led.sh 用來控制 LED 的閃燈

    wait .... 這行用來隱藏 killed ... 的文字訊息

    標籤 (Edit tags)
    • No tags
    您必須 登入 才能發佈評論。
    Powered by MindTouch Core