/*********************************************************************
* Author : Samson
* Date : 08/17/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)
* *******************************************************************/
很多時候,我們都會寫shell程序來完成一些不用重復造輪子的時刻,但是,又因為shell語句中也會有函數,也會有變量,在運行後到底執行了哪些相關的操作,就需要對具體執行過程中的變量等可變的因素的監控,那麼我們下面就寫個小小的shell例子,來完成這個對執行過程中條件語句中的變量的變化的監控和整個程序的執行流程的觀察。
shell程序代碼:
#!/bin/bash
function setlogfile
{
if ! [ -z "$1" ]; then
echo "logfilename is not empty!" >> kthh
exec 2>> $1
exec 1>> $1
fi
}
num1=$1
logfile=$2
execlogfile=$3
setlogfile ${execlogfile}
set -x
if [ $num1 -eq 0 ]; then
echo "num1 is 0">> ${logfile}
elif [ $num1 -ge 0 ]; then
echo "num1 is grate 0">> ${logfile}
else
echo "num1 is less 0">> ${logfile}
fi
/sbin/shutdown -k 10
if [ $num1 -eq 0 ]; then
echo "num1 is 0 again">> ${logfile}
fi
在命令行中執行:
[root@UFO shellprogram]# ./testexecutelog.sh 0 msglog execlog
在以上的shell腳本程序中 num1對應的值為命令行中的0 logfile的值為msglog execlogfile的值為execlog
函數 setlogfile的使用為 setlogfile 日志文件名,在例子中的使用setlogfile ${execlogfile},函數中的exec 2>> $1;exec 1>> $1表示把標准輸出和標准錯誤輸出的信息都重定向到execlog文件中。
下面我們來看看execlogfile中的內容,就可以看到shell程序的執行流程和執行過程中的變量的值的變化。
[root@UFO shellprogram]# cat execlog
+ '[' 0 -eq 0 ']'
+ echo 'num1 is 0'
+ /sbin/shutdown -k 10
+ '[' 0 -eq 0 ']'
+ echo 'num1 is 0 again'
可見,程序中的流程是和./testexecutelog.sh後的第一個參數決定的。你還可以把第一個參數改為大於0的或小於0的值進行測試。
其中,最重要的一句是set -x,此句的含義為:在每個簡單命令被擴展之後,顯示PS4擴展值,之後是要執行的命令 。 若不執行這句,則不會將執行中變量的實際值打印到execlog中。有關set的使用可man set了解更多。