Bash编程(二)之if判断与函数

一、if语句

If语句:用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。测试条件,状态返回值为0或为真,则执行选择分支。三种使用格式:单分支、双分支、多分支。

    格式:

         1、单分支:

                              if 测试条件;then

                                  选择分支

                              fi     

    注意:如果把命令执行成功与否当作条件,则if语句后必须只跟命令本身,而不能引用。

        自定义shell进程的状态返回值:

 exit [n]

     2、双分支:两个分支仅执行其中之一

       if 测试条件;then

                             选择分支1

             else

                             选择分支2

             fi   

     3、多分支:

       if 条件1;then

           分支1

       elif 条件2;then

           分支2   

       elif 条件3;then

           分支3

       ...

       else 条件n;then

           分支n     

      fi

      

    注:测试条件:如果不是命令要用[],为命令时不加[]

 

实际操练一下:

 例题:

知识点:位置变量、自定义状态返回值、单分支if语句、多分支if语句。

传递一个用户名给脚本:

如果此用户的id号为0,则显示说这是管理员,如果此用户的id号大于等于500,则显示说这是普通用户。否则,则说这是系统用户

#!/bin/bash

#

if [ $# -lt 1 ]; then

         echo"Usage: `basename $0` username"

exit 1  #自定义状态返回值为1

fi

#单分支

#判断是否有参数

if ! id -u $1 &> /dev/null; then

         echo"Usage: `basename $0` username"

         echo"No this user $1."

         exit2 #自定义状态返回值为2

fi

#单分支

#判断用户是否存在

if [ $(id -u $1) -eq 0 ]; then

         echo"Admin"

elif [ $(id -u $1) -ge 500 ]; then

echo "Common user."

else

         echo"System user."

fi

#多分支

#脚本真正判断用户id

 

扩展:嵌套的if语句

嵌套的if语句相对复杂一点,当条件1满足时,就运行第一个then后面的语句,在条件1满足后,在判断条件2,当条件1和条件2同时满足的时候就会运行第二个then后面的语句,当只有条件1满足,条件2不满足就会运行第一个else后面的语句,如果条件1都不满足,那就直接运行第二个else后面的语句。

if [ 条件1 ];then

           if [ 条件2 ];then

                 语句...

          else

                 语句.....

fi

   else

             语句....

Fi

实例:还以上面的例题为例

#!/bin/bash

#

if [ $# -lt 1 ]; then#判断是否有参数

         echo"Usage: `basename $0` username"

exit 1  #自定义状态返回值为1

ifid$1&> /dev/null;then#判断用户是否存在

    echo "Usage: `basename $0`username"

echo"No this user $1."

    exit 2

      if [ $(id -u $1) -eq0 ]; then#脚本真正判断用户id

                  echo "Admin"

        elif [ $(id -u $1) -ge 500 ]; then

                  echo "Common user."

        else

                  echo "System user."

        fi

fi

fi

 

例题2

知识点:位置变量、文件比较运算、逻辑运算、组合条件测试、自定义状态返回值、多分支if语句。

写一个脚本,使用格式:

                   script.sh{start|stop|restart|status}

                   1)start: 创建/var/lock/subsys/script.sh

                   2)stop: 删除此文件

                   3)restart: 先删除文件,再创建文件

                   4)status: 如文件存在,显示running,否则,显示stopped

 

#!/bin/bash

#

srv=`basename $0`

 

lockFile="/var/lock/subsys/$srv"

 

[ $# -lt 1 ] && echo "Usage:$srv {start|stop|restart|status}" && exit 2

 

[ $UID -ne 0 ] && echo "Onlyroot." && exit 3

 

if [ "$1" == 'start' ]; then

   if[ -f $lockFile ]; then

       echo "$srv is running."

       exit 4

  else

       touch $lockFile

       [ $? -eq 0 ] && echo "Starting $srv OK."

   fi

elif [ "$1" == 'stop' ]; then

   if [ -f $lockFile ]; then

       rm -f $lockFile

       [ $? -eq 0 ] && echo "Stopping $srv OK."

   else

       echo "$srv is stopped yes."

       exit 5

   fi

elif [ "$1" == 'restart' ]; then

   if [ -f $lockFile ];then

       rm -f $lockFile

       [ $? -eq 0 ] && echo "Stopping $srv OK."

   else

       echo "$srv is stopped yet."

   fi

   touch $lockFile

    [$? -eq 0 ] && echo "Starting $srv OK."

elif [ "$1" == 'status' ];then

   if [ -f $lockFile ];then

       echo "$srv is running."

   else

       echo "$srv is stopped."

   fi

else

   echo "Usage: $srv {start|stop|restart|status}" && exit6

fi

二、case语句

case语句:有多个测试条件时,case语句会使得语法结构更明晰,等同于多分支的if语句。

   格式:

case $变量引用 in

   PATTERN1)

      分支1

      ;;

   PATTERN2)

      分支2

      ;;   

  ....

   *)

     分支n

     ;;

   Esac

实例:

写一个脚本,使用格式:

                   script.sh{start|stop|restart|status}

                   1)start: 创建/var/lock/subsys/script.sh

                   2)stop: 删除此文件

                   3)restart: 先删除文件,再创建文件

                   4)status: 如文件存在,显示running,否则,显示stopped

#!/bin/bash

#

srv=`basename $0`

 

lockFile="/var/lock/subsys/$srv"

 

[ $# -lt 1 ] && echo "Usage:$srv {start|stop|restart|status}" && exit 4

 

[ $UID -ne 0 ] && echo "Onlyroot." && exit 5

 

case $1 in

start)

   if[ -f $lockFile ]; then

       echo "$srv is running."

         exit7

  else

         touch$lockFile

         [$? -eq 0 ] && echo "Starting $srv OK."

   fi

   ;;

stop)

   if [ -f $lockFile ]; then

         rm-f $lockFile

         [$? -eq 0 ] && echo "Stopping $srv OK."

   else

         echo"$srv is stopped yes."

         exit6

   fi

   ;;

restart)

   if [ -f $lockFile ];then

            rm -f $lockFile

         [$? -eq 0 ] && echo "Stopping $srv OK."

   else

         echo"$srv is stopped yet."

   fi

   touch $lockFile

    [$? -eq 0 ] && echo "Starting $srv OK."

   ;;

status)

   if [ -f $lockFile ];then

         echo"$srv is running."

   else

         echo"$srv is stopped."

   fi

   ;;

*)

   echo "Usage: $srv {start|stop|restart|status}" && exit9

三、函数:shell脚本代码可以封装在函数内,而函数可以在脚本任意处使用,由此减少大段代码的重复编写。

格式:

方法一:

   funstion F_NAME{

                                     函数体   

   }  

 

方法二:

   F_NAME(){

                                     函数体   

    }

 

调用:使用函数名,函数名出现的地方,会被自动替换为函数

函数的返回值:分正常返回值和执行状态返回值。

      1、正常返回值:代码的输出

           函数中的打印语句:echo ,print

           函数中调用的系统命令执行后返回的结果

      2、执行状态返回值:     

            执行状态返回值取决与函数体中最后一次执行的命令状态结果

            自定义函数执行状态的返回值: return #

函数的参数:

     在函数体中调用函数参数的方式合脚本中调用脚本参数的方式一样(位置参数)

                            $1,$2, ...

                            $#,$*, $@

实例:

写一个脚本,使用格式:

                   script.sh{start|stop|restart|status}

                   1)start: 创建/var/lock/subsys/script.sh

                   2)stop: 删除此文件

                   3)restart: 先删除文件,再创建文件

                   4)status: 如文件存在,显示running,否则,显示stopped

 

#!/bin/bash

#

# chkconfig: 2345 67 34

#

srvName=$(basename $0)

 

lockFile=/var/lock/subsys/$srvName

 

start() {

   if [ -f $lockFile ];then

         echo"$srvName is already running."

         return1

   else

         touch$lockFile

         [$? -eq 0 ] && echo "Starting $srvName OK."

         return0

    fi

}

 

stop() {

   if [ -f $lockFile ];then

         rm-f $lockFile &> /dev/null

         [$? -eq 0 ] && echo "Stop $srvName OK" && return 0

   else

         echo"$srvName is not started."

         return1

   fi

}       

 

status() {

   if [ -f $lockFile ]; then

         echo"$srvName is running."

   else

         echo"$srvName is stopped."

   fi

   return 0

}

 

usage() {

    echo "Usage: $srvName {start|stop|restart|status}"

    return 0

}

 

case $1 in

start)

         start

         ;;

stop)

         stop;;

restart)

         stop

         start;;

status)

         status;;

*)

         usage

         exit1 ;;

esac