很多時(shí)候,我們都會(huì)寫shell程序來完成一些不用重復(fù)造輪子的時(shí)刻,但是,又因?yàn)閟hell語句中也會(huì)有函數(shù),也會(huì)有變量,在運(yùn)行后到底執(zhí)行了哪些相關(guān)的操作,就需要對(duì)具體執(zhí)行過程中的變量等可變的因素的監(jiān)控,那么我們下面就寫個(gè)小小的shell例子,來完成這個(gè)對(duì)執(zhí)行過程中條件語句中的變量的變化的監(jiān)控和整個(gè)程序的執(zhí)行流程的觀察。
#!/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
函數(shù) setlogfile的使用為 setlogfile 日志文件名,在例子中的使用setlogfile ${execlogfile},函數(shù)中的exec 2>> $1;exec 1>> $1表示把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出的信息都重定向到execlog文件中。
其中,最重要的一句是set -x,此句的含義為:在每個(gè)簡單命令被擴(kuò)展之后,顯示PS4擴(kuò)展值,之后是要執(zhí)行的命令 。 若不執(zhí)行這句,則不會(huì)將執(zhí)行中變量的實(shí)際值打印到execlog中。有關(guān)set的使用可man set了解更多。
注意:exec 在對(duì)文件描述符進(jìn)行操作的時(shí)候,也只有在這時(shí),exec 不會(huì)覆蓋你當(dāng)前的 shell 環(huán)境。也即是不會(huì)啟動(dòng)個(gè)新的進(jìn)程。