22、bash脚本编程之五 case语句及脚本选项进阶

22.1 选择结构:

1、if语句

单分支、

    if: 

    if CONDITION; then

      statement

      ...

    fi

    双分支、

    if CONDITION; then

      statement

      ...

    else

      statement

      ...

    fi

多分支

    if CONDITION1; then

      statement

      ...

    elif CONDITION2; then

      statement

      ...

    esle

      statement

      ...

    fi

2、case语句:选择结构

    case SWITCH in 

    value1)

      statement

      ...

      ;;

    value2)

      statement

      ..

      ;;

    *)

      statement

      ...

      ;;

    esac

例1

    a-z

    A-Z

    0-9

    [abc]

    输出不同的对应结果

    #!/bin/bash

    #

    case $1 in

    [A-Z])

            echo "upper";;

    [a-z])

            echo "lower";;

    [0-9])

            echo "number";;

    *)

            echo "wrong input";;

    esac

例2

    只识别参数start,stop,restart,status其中之一

    #!/bin/bash

    #

    case $1 in

    start)

       echo start;;

    stop)

       echo stop;;

    restart)

       echo restart;;

    status)

       echo status;;

    *)

       echo "The usage is `basename $0` {start|stop|restart|status}";;

    esac

例3

写一个脚本,可以接受选项及参数,而后能获取每一个参数,及选项的参数,并能根据选项做出特定的操作,比如

adminusers.sh --add tom.jerry --del tom,jerry -v|--verbose -h|--help

    #!/bin/bash

    #

    #调试信息

    DEBUG=0

    ADD=0

    DEL=0

    for I in `seq 0 $#`; do

      if [ $# -gt 0 ]; then

          case $1 in

          -v|--verbose)

            DEBUG=1

            shift ;;

          -h|--help)

            echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"

            exit 0

            ;;

          --add)

            ADD=1

            ADDUSERS=$2

            shift 2

            ;;

          --del)

            DEL=1

            DELUSERS=$2

            shift 2

            ;;

          *)

            echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"

            exit 7

            ;;

        esac

      fi

    done

    if [ $ADD -eq 1 ]; then

      for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do

        if id $USER &> /dev/null; then

          [ $DEBUG -eq 1 ] && echo "$USER exists."

        else

          useradd $USER

          [ $DEBUG -eq 1 ] && echo "Add user $USER finished."

        fi

      done

    fi

    if [ $DEL -eq 1 ]; then

      for USER in `echo $DELUSERS | sed 's@,@ @g'`; do

        if id $USER &> /dev/null; then

          userdel -r $USER

         [ $DEBUG -eq 1 ] && echo "Delete $USER finished."

        else

         [ $DEBUG -eq 1 ] && echo "$USER not exist."

        fi

      done

    fi

例4

练习:写一个脚本showlogged.sh,其用法格式为:

showlogged.sh -v -c -h|--help

其中,-h选项只能单独使用,用于显示帮助信息;-c选项时,显示当前系统上登录的所有用户数;如果同时使用了-v选项,则既显示同时登录的用户数,又显示登录的用户的相关信息;如

Logged users: 4. 

They are:

root     tty2         Feb 18 02:41

root     pts/1        Mar  8 08:36 (172.16.100.177)

root     pts/5        Mar  8 07:56 (172.16.100.177)

hadoop   pts/6        Mar  8 09:16 (172.16.100.177)

    #!/bin/bash

    #

    declare -i SHOWNUM=0

    declare -i SHOWUSERS=0

    for I in `seq 1 $#`; do

      if [ $# -gt 0 ]; then

        case $1 in

        -h|--help)

          echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"

          exit 0 ;;

        -v|--verbose)

          let SHOWUSERS=1

          shift ;;

        -c|--count)

          let SHOWNUM=1

          shift ;;

        *)

          echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"

          exit 8 ;;

        esac

      fi

    done

    if [ $SHOWNUM -eq 1 ]; then

      echo "Logged users: `who | wc -l`."

      if [ $SHOWUSERS -eq 1 ]; then

        echo "They are:"

        who

      fi

    fi

Comments Closed.