說明
當開發 SHELL 時,遇到需執行較久的程式段,可以參考此篇範例,在等待程式結束前使終端機有個小動畫,用來表示程式執行中。
讓自己寫的 SHELL Script 比別人酷炫多了。
範例一:顯示進度條
reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)Callstack:
at User:Alang/Linux_&_UNIX_工作筆記/Linux_SHELL/程式執行時的進度顯示
MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException: reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown.
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptVar expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptVar.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Evaluate (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state, Boolean evaluateProperties) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptAccess.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptCall expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptCall.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptSequence expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptSequence.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptReturnScope expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
以下是我參考的文章:
使用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)Callstack:
at User:Alang/Linux_&_UNIX_工作筆記/Linux_SHELL/程式執行時的進度顯示
MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException: reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown.
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptVar expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptVar.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Evaluate (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state, Boolean evaluateProperties) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptAccess.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptCall expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptCall.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptSequence expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptSequence.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptReturnScope expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
TIPs:
led.sh 用來控制 LED 的閃燈
wait .... 這行用來隱藏 killed ... 的文字訊息