Shell编程实例--Redhat 自带程序Service分析

                          测试空间旗下大头针出品

#!/bin/sh

#建立默认搜索路径
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
export PATH

#定义变量,变量包括有关service 程序的版本信息、使用方法、以及程序所在的
#basename命令去除$0所代表的文件名的目录部分和后缀名,只显示基本文件名

VERSION="`basename $0` ver. 0.91"
USAGE="Usage:`basename $0`

cd /
#如果参数个数大于零,表示循环条件成立
while [ $# -gt 0 ]
do
#case表示多条件选择
#$1表示命令service的第一个参数
  case "${1}" in
#如果service --help则此条件成立
 --help | -h | --h* )
  echo $"${USAGE}">&2
  exit 0
  ;;
#如果service --version则此条件成立
 --version | -V )
  echo $"${USAGE}">&2
  exit 0
  ;;
#如果其他情况则此条件成立
 *)
  #-z表示SERVICE变量为空 -a是逻辑与
  #参数等于1 并且 命令后的参数是 --status-all
                #表示条件成立
  if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]
  then
  #切换到 /etc/init.d
  cd ${SERVICEDIR}
# *表示/etc/init.d下的所有文件名列表,
#所以/etc/init.d下有多少文件,就循环多少次
#显示/etc/init.d下除没有状态参数的命令文件外的其他命令文件status
  for SERVICE in *
  do
   case "${SERVICE}" in
#如果是SERVICE是function等,因为这些程序师没有status(状态)的。  
   function | halt | killall | single | linuxconf |/       kudzu|*rpmorig|*rpmnew|*rpmsave|*~|*.org)
     ;;
#其他则可以,显示状态.比如SERVICE可以是httpd
    *)
#-x表示 检查/etc/init.d/httpd是否可执行
     if [ -x "${SERVICEDIR}/${SERVICE}" ]
     then
#如果SERVICE是httpd,下面的应该是/etc/init.d/httpd status
    env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" status
    fi
   ;;
       esac
  done

      exit0
#service有两个参数,且第2个参数是--full-restart。
 elif [ $# -eq 2 -a "${2}" == "--full-restart" ]
 then
#SERVICE来自命令行的参数,比如SERVICE httpd --full-restart
#$1表示httpd
  SERVICE="${1}"
  if [ -x "${SERVICEDIR}/${SERVICE}" ]
  then
#所以SERVICE所代表的服务停止
  env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
#所以SERVICE所代表的服务启动
  env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start 
#$?表示启动服务后命令的执行状态。一般$?为1表示命令执行失败
#$?为0表示命令执行成功 
  exit $?
  fi
#如果不满足上面的条件,即不是只有一个参数,也不是又两个参数;比如:
#即不属于service --status-all 或者也不属于service httpd --full-restart情况 
#比如输入的是service httpd restart
#第一次while循环 -z 条件成立
       elif [ -z "${SERVICE}" ]
  then
#在第一次while循环的情况下 SERVICE为httpd
  SERVICE="${1}"
#如果输入的是service httpd restart 则在第二次while循环时,OPTIONS则会获得restart 
  else
  OPTIONS="${OPTIONS}${1}"
  fi
#shift 位置参数往前平移1个位置,也就是说$2的值会传给$1.$3的值传递$1.
#OPTIONS得到了$2的值,也就是OPTIONS为restart
  shift
  ;;
 esac
done

#按照前面的思路SERVICE为httpd,-x 表示检测/etc/init.d/httpd是否可执行
 
if [ -x "${SERVICEDIR}/${SERVICE}" ]
then
#依据前面举得例子,shift使得OPTIONS平移,则会执行/etc/init.d/httpd restart
 env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
#如果条件不成立,比如service ht restart,以为/etc/init.d没有ht程序
else
 echo $"${SERVICE}:unrecognized service" >&2
 exit 1
fi

你可能感兴趣的:(Linux)