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;
}