欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 08_02 _bash脚本编程之七 case语句及脚本选项进阶 有大用

写一个脚本,利用RANDOM生成10个随机数,并找出其中的最大值,和最小值,显示出来     

[root@ebs-22618 ~]# for I in {1..10}; do echo -n "$RANDOM,"; done


[root@ebs-22618 ~]# for I in {1..10}; do echo -n "$RANDOM,"; echo -e "\n"; done

29169,


5389,


2239,


17563,


8902,


6632,


25209,


10211,


15291,


12332,


[root@ebs-22618 ~]#

[root@ebs-22618 ~]# for I in {1..10}; do echo -n "$RANDOM,";  done; echo -e "\n"

19554,27906,16709,10582,847,20048,6522,8188,6807,14626,


(-n 就是后面跟着字符,不换行 -e 就是把里面的内容转义)



[root@ebs-22618 ~]#

[root@ebs-22618 ~]# vim random.sh

 

 1 #!/bin/bash

  2 #

  3 declare -i MAX=0

  4 declare -i MIN=0

  5 for I in {1..10}; do

  6   MYRANDOM=$RANDOM

  7   [ $I -eq 1] && MIN=$MYRANDOM

  8   if [ $I -le 9 ]; then

  9     echo -n "$MYRANDOM,"

 10   else

 11     echo  "$MYRANDOM"

 12   fi

 13   [ $MYRANDOM -gt $MAX ] && MAX=$MYRANDOM

 14   [ $MYRANDOM -lt $MIN ] && MIN=$MYRANDOM

 15 done

 16 echo $MAX,$MIN



[root@ebs-22618 ~]# bash -x random.sh  (有问题时 bash -x 试试看)


可以先生成1个随机数,然后在循环里生成9个随机数


面向过程

    控制结构

        顺序结构

        选择结构

        循环结构

选择结构:

if:单分支,双分支,多分支

if CONDITION; then

    statement

    ...

fi

if CONDITION; then

    statement

    ...

else 

    statement

    ...

fi


if CONDITION1; then

    statement

    ...

elif  CONDITION2; then

    statement

    ...

else 

    statement

    ...

fi

多分支效率低


case 语句:选择结构, 比 if else 明晰得多  下面SWITCH 是变量的值,要加$美元符的

case SWITCH in   

value1)

    statement

    ...

    ;;   (使用双分号结尾,双分号可以接在上一行写)     

value2)

    statement

    ...

    ;;   (使用双分号结尾,双分号可以接在上一行写)

*)

    statement

    ...

    ;;   (使用双分号结尾,双分号可以接在上一行写)  (最后一句可以没有双分号)

esac                           结束(case反过来写)



[a-z]

[A-Z]

[0-9]

[abc]


[root@ebs-22618 ~]# vim case.sh  

  1 #!/bin/bash

  2 #

  3 case $1 in

  4 [0-9])                  

  5   echo "A digit."

  6   ;;

  7 [a-z])  这种方法 好像不区分大小写 [a-z]改为[[:lower:]]

  8   echo "Lower"

  9   ;;

 10 [A-Z])  这种方法 好像不区分大小写 [a-z]改为[[:lower:]]

 11   echo "Upper"

 12   ;;

 13 *)

 14   echo "Special character"

 15   ;;

 16 esac


最好使用下面这个

#!/bin/bash

#

case $1 in

[0-9])

  echo "A digit."

  ;;

[[:upper:]])

  echo "Upper"

   ;;

[[:lower:]])

  echo "Lower"

  ;;

*)

  echo "Special character"

  ;;

esac

上面这些字符最好加上引号引起来

[root@ebs-22618 ~]# bash -n case.sh

[root@ebs-22618 ~]# chmod +x case.sh

[root@ebs-22618 ~]# ./case.sh D

Upper

[root@ebs-22618 ~]# ./case.sh d

Lower

[root@ebs-22618 ~]# ./case.sh 5

A digit.

[root@ebs-22618 ~]# ./case.sh ,

Special character


脚本 只接受参数 start,stop,restart,status ,别的参数的话,就告知,只能使用其中之一

[root@ebs-22618 ~]# vim service.sh

#!/bin/bash

#

case $1 in

 'start')

   echo "start server ...";;

 'stop')

   echo "stop server ...";;

 'restart')

   echo "Restart server...";;

 'status')

   echo "Running ...";;

*)

   echo "`basename $0` {start|stop|restart|staus}";;

esac


[root@ebs-22618 ~]# chmod +x service.sh


[root@ebs-22618 ~]# ./service.sh start

start server ...

[root@ebs-22618 ~]# ./service.sh st

service.sh {start|stop|restart|staus}

[root@ebs-22618 ~]#

[root@ebs-22618 ~]# ./service.sh stop

stop server ...

[root@ebs-22618 ~]# ./service.sh restart

Restart server...

[root@ebs-22618 ~]# ./service.sh status

Running ...

[root@ebs-22618 ~]#


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

adminusers.sh --add tom,jerrry --del tom,blair -v|--version -h|--help


(linux 中一个重要的哲学 没有消息就是最好的消息,如果程序执行没有消息显示出来,说明程序执行成功了)



[root@ebs-22618 ~]# vim debug.sh

#!/bin/bash

#

DEBUG=0

case $1 in

-v|--verbose)

  DEBUG=1;;

*)

  echo "UnKnown options"

  exit 7;;

esac

[ $DEBUG -eq 1 ] && echo hello


[root@ebs-22618 ~]# chmod +x debug.sh



[root@ebs-22618 ~]# ./debug.sh -v

hello

[root@ebs-22618 ~]# ./debug.sh --verbose

hello

[root@ebs-22618 ~]# ./debug.sh --verb

UnKnown options

[root@ebs-22618 ~]#



[root@ebs-22618 ~]# vim adduser3.sh


#!/bin/bash

#

DEBUG=0

case $1 in

-v|--verbose)

  DEBUG=1;;

esac


useradd tom &> /dev/null

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


[root@ebs-22618 ~]# chmod +x adduser3.sh


[root@ebs-22618 ~]# ./adduser3.sh  (没有提示)

[root@ebs-22618 ~]# userdel -r tom

[root@ebs-22618 ~]# ./adduser3.sh -v (有提示)

Add user tom finished.



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

adminusers.sh --add tom,jerrry --del tom,blair -v|--version -h|--help






[root@ebs-22618 ~]# vim adminusers3.sh


#!/bin/bash

#

DEBUG=0

ADD=0

DEL=0

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

  USERS=$2

  shift 2;;

--del)

  DEL=1

  USERS=$2

  shift 2;;

*)


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

  exit 7;;

esac


echo $DEBUG $ADD $DEL



[root@ebs-22618 ~]# chmod +x adminusers3.sh


[root@ebs-22618 ~]# ./adminusers3.sh -v --add

1 0 0



[root@ebs-22618 ~]# bash -x adminusers3.sh -v --add

+ DEBUG=0

+ ADD=0

+ DEL=0

+ case $1 in

+ DEBUG=1

+ shift

+ echo 1 0 0

1 0 0



case ( 包括 if else  ) 只执行一个分支,其它的分支就不会执行了


通过 for 循环,这么做,好像是可以的

#!/bin/bash

#

DEBUG=0

ADD=0

DEL=0

for I in `seq 0 $#`; do

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

  USERS=$2

  shift 2;;

--del)

  DEL=1

  USERS=$2

  shift 2;;

*)


  echo "Usage; `basename $0` --add USER_LIST --del USER_LIST -V|--verbose -h|--help"

  exit 7;;

esac

done

echo $DEBUG $ADD $DEL



[root@ebs-22618 ~]# bash -x adminusers3.sh -v --add

+ DEBUG=0

+ ADD=0

+ DEL=0

++ seq 0 2

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEBUG=1

+ shift

+ for I in '`seq 0 $#`'

+ case $1 in

+ ADD=1

+ USERS=

+ shift 2

+ for I in '`seq 0 $#`'

+ case $1 in

+ echo 'first --add'

first --add

+ ADD=1

+ USERS=

+ shift 2

+ echo 1 1 0

1 1 0



[root@ebs-22618 ~]# bash -x adminusers3.sh -v --add --del

+ DEBUG=0

+ ADD=0

+ DEL=0

++ seq 0 3

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEBUG=1

+ shift

+ for I in '`seq 0 $#`'

+ case $1 in

+ ADD=1

+ USERS=--del

+ shift 2

+ for I in '`seq 0 $#`'

+ case $1 in

++ basename adminusers3.sh

+ echo 'Usage; adminusers3.sh --add USER_LIST --del USER_LIST -v|--verbose -h|--help'

Usage; adminusers3.sh --add USER_LIST --del USER_LIST -V|--verbose -h|--help

+ exit 7


[root@ebs-22618 ~]# bash -x adminusers3.sh -v --add user1,user2 --del

+ DEBUG=0

+ ADD=0

+ DEL=0

++ seq 0 4

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEBUG=1

+ shift

+ for I in '`seq 0 $#`'

+ case $1 in

+ ADD=1

+ USERS=user1,user2

+ shift 2

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEL=1

+ USERS=

+ shift 2

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEL=1

+ USERS=

+ shift 2

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEL=1

+ USERS=

+ shift 2

+ echo 1 1 1

1 1 1



[root@ebs-22618 ~]# bash -x adminusers3.sh --help

+ DEBUG=0

+ ADD=0

+ DEL=0

++ seq 0 1

+ for I in '`seq 0 $#`'

+ case $1 in

++ basename adminusers3.sh

+ echo 'Usage; adminusers3.sh --add USER_LIST --del USER_LIST -V|--verbose -h|--help'

Usage; adminusers3.sh --add USER_LIST --del USER_LIST -V|--verbose -h|--help

+ exit 0



[root@ebs-22618 ~]# bash -x adminusers3.sh -v --help

+ DEBUG=0

+ ADD=0

+ DEL=0

++ seq 0 2

+ for I in '`seq 0 $#`'

+ case $1 in

+ DEBUG=1

+ shift

+ for I in '`seq 0 $#`'

+ case $1 in

++ basename adminusers3.sh

+ echo 'Usage; adminusers3.sh --add USER_LIST --del USER_LIST -V|--verbose -h|--help'

Usage; adminusers3.sh --add USER_LIST --del USER_LIST -V|--verbose -h|--help

+ exit 0






#!/bin/bash

#

DEBUG=0

ADD=0

DEL=0

for I in `seq 0 $#`; do

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


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 exists."

    fi

  done

fi





[root@ebs-22618 ~]#  ./adminusers3.sh --add tom,jerry,natasha

[root@ebs-22618 ~]# 

[root@ebs-22618 ~]# id tom

uid=5017(tom) gid=5019(tom) 组=5019(tom)

[root@ebs-22618 ~]# id jerry

uid=5018(jerry) gid=5020(jerry) 组=5020(jerry)

[root@ebs-22618 ~]# id natasha

uid=5019(natasha) gid=5021(natasha) 组=5021(natasha)

[root@ebs-22618 ~]#  ./adminusers3.sh --del tom

[root@ebs-22618 ~]# 

[root@ebs-22618 ~]#  ./adminusers3.sh -v --del jerry,natasha

Delete jerry finished.

Delete natasha finished.

[root@ebs-22618 ~]#  ./adminusers3.sh -v --add tom,jerry

Add user tom finished.

Add user jerry finished.

[root@ebs-22618 ~]#  ./adminusers3.sh  --add natasha

[root@ebs-22618 ~]#

[root@ebs-22618 ~]# id natasha

uid=5020(natasha) gid=5022(natasha) 组=5022(natasha)


[root@ebs-22618 ~]#  ./adminusers3.sh -v  --add tom,jerry,natasha

tom exists.

jerry exists.

natasha exists.

[root@ebs-22618 ~]#



[root@ebs-22618 ~]#  ./adminusers3.sh -v  --del  tom,jerry,natasha

 tom not exists.

Delete jerry finished.

Delete natasha finished.


[root@ebs-22618 ~]#  ./adminusers3.sh -v  --add tom,jerry,natasha --del tom

Add user tom finished.

Add user jerry finished.

Add user natasha finished.

Delete tom finished.

[root@ebs-22618 ~]#  ./adminusers3.sh -v  --add tom,jerry,natasha --del tom --help  (有了help 直接退出了)

Usage; adminusers3.sh --add USER_LIST --del USER_LIST -v|--verbose -h|--help

[root@ebs-22618 ~]#



















[root@ebs-22618 ~]# vim test11.sh

#!/bin/bash

echo $1

shift 3

echo $1

shift 4

echo $1

shift 5

echo $1

shift 6

echo $1

[root@ebs-22618 ~]# ./test11.sh 22  (当shift 超过个数的时候,好像shift 就不起作用了)

22

22

22

22

22




面向对象

普通分类: