shell指令碼程式需要注意的幾點:
<1>變數使用前不需提前聲明,直接使用即可;
<2>變數不存在任何資料類型的概念,統一預設為字串;
<3>賦值操作等號的任何一邊不能加空格,如有在操作符兩邊加空格的編程習慣時,需要注意這點;
<4>以#號開始的地方被理解為注釋。
例一:如下為一個讀取指定檔案中變數值的簡單程式(有三個變數:HOME PATH SAVE):
FILENAME=pathfile
if [ ! -f $FILENAME ];then
#-f(檢測檔案是否存在並且是普通檔案)
echo "FILE : $FILENAME does not exit!"
exit 1
fi
cat $FILENAME | grep -v "#" | while read VAR
#-v(不包含指定字串的行)
#read VAR(把讀入的內容賦給變數VAR)
do
NAME=`echo $VAR | awk 'BEGIN { FS = "=" } {print $1} '`
#FS(指定分隔字元)
PATH_IS=`echo $VAR | awk 'BEGIN { FS = "=" } {print $2} '`
if [ -n $NAME ];then
#-n(非空判斷)
if [ "$NAME" = "HOME" ];then
#if判斷可以為if test "$name" = china或者if [ "$name" = china ]兩種格式,需要注意的是test把所有運算元和操作符作為單獨的參數分別對待,也就是說他們之間至少要有一個空白字元分隔(等號兩邊必須要有空格作分隔);如果用第二種格式的話,在[之後和]之前都要空格
HOME=$PATH_IS
export HOME
#export命令讓shell把給定的變數標誌為匯出,他們的值要傳遞給子shell,理解為相當於設定其為全域變數
fi
if [ "$NAME" = "PATH" ];then
PATH=$PATH_IS
export PATH
fi
if [ "$NAME" = "SAVE" ];then
SAVE=$PATH_IS
export SAVE
fi
else
echo "NAME is null!"
exit 1
fi
done;
例二:如下為殺掉指定進程的一個簡單程式(進程名由例一程式中的變數PATH傳遞過來):
kill_id(){
ps -ef | grep ${PATH} | while read LINE
do
if [ "`echo $LINE | awk -c: '{print $3}' -`" = "1" ]; then
APP_EPID=`echo $LINE | awk -c: '{print $2}'`
kill -9 $APP_EPID &
sleep 1
fi
done;
}