Shell编程实例--Redhat 自带程序Service分析_测试空间_新浪博客

                                                                                     

                                    旗下出品

shell基础知识请参看:

 

程序如下:

#!/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`<option>| --status-all|\
[ service_name [ command|--full-restart ] ]"
SERVICE=
SERVICEDIR="/etc/init.d"
OPTIONS=
# $#表示命令参数的个数,如果只输入service,表示没有参数即$#为0
# 如果参数为0则条件成立,则执行本if语句并退出程序
# 2为标准错误流也是接到仿真终端的屏幕,所以屏幕上会显示USAGE中内容。
if [ $# -eq 0 ]; then
 echo $"${USAGE}" >&2
 exit 1
fi

cd /
#如果参数个数大于零,表示循环条件成立
while [ $# -gt 0 ]
do
#case表示多条件选择
#$1表示命令service的{dy}个参数
  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
#{dy}次while循环 -z 条件成立
       elif [ -z "${SERVICE}" ]
  then
#在{dy}次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

 

已投稿到:
郑重声明:资讯 【Shell编程实例--Redhat 自带程序Service分析_测试空间_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——