运维之shell篇-----3.循环结构 、 case语句 、 函数及中断控制

来源:互联网 发布:qq2012透明皮肤软件 编辑:程序博客网 时间:2024/05/22 15:42

THREE DAY

1.使用for循环结构 

2.使用while循环结构 

3.基于case分支编写脚本 

4.使用Shell函数 

5.中断及退出 

for  变量名  in  值列表

Do

命令序列

Done

步骤一:练习for循环基本用法

脚本1,通过循环读取账户文件user.txt,批量创建账户:

  1. [root@svr5 ~]# vim for01.sh
  2. #!/bin/bash
  3. for i in $(cat root/user.txt)
  4. do
  5.         useradd $i
  6.         echo "123456" | passwd --stdin $i
  7. done
  8. [root@svr5 ~]# chmod +x for01.sh

步骤二:批量检测多个主机的存活状态

1)编写脚本如下:

  1. [root@svr5 ~]# vim chkhosts.sh
  2. #!/bin/bash
  3. for IP in {1..254}
  4. do
  5. ping -c 3 -i 0.2 -W 3 192.168.4.$IP &> /dev/null
  6. if [ $? -eq 0 ] ; then
  7. echo "Host 192.168.4.$IP is up."
  8. else
  9. echo "Host 192.168.4.$IP is down."
  10. fi
  11. done
  12. [root@svr5 ~]# chmod +x chkhosts.sh

4)测试、验证脚本

  1. … …
  2. [root@svr5 ~]# ./chkhosts.sh
  3. Host 192.168.4.5 is up.
  4. Host 192.168.4.6 is down

while  条件测试

Do

   命令序列

Done

 

步骤一:批量添加用户账号stu1-stu20

添加的账号有固定的前缀stu(练习中可自行设置),多个账号从1开始编号,比如stu1、stu2、stu3、……、stu20。—— 编写脚本uaddwhile.sh,实现批量添加这20个用户账号的功能,密码均设为123456。

脚本编写参考如下:

  1. [root@svr5 ~]# vim uaddwhile.sh
  2. #!/bin/bash
  3. PREFIX="stu"                                     //定义用户名前缀
  4. i=1
  5. while [ $i -le 20 ]
  6. do
  7. useradd ${PREFIX}$i                             //添加的用户名为:前缀+编号
  8. echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
  9. let i++
  10. done
  11. [root@svr5 ~]# chmod +x uaddwhile.sh

执行脚本并验证结果:

  1. [root@svr5 ~]# ./uaddwhile.sh
  2. [root@svr5 ~]# grep ^stu /etc/passwd             //检查添加的用户
  3. stu1:x:531:531::/home/stu1:/bin/bash
  4. stu2:x:532:532::/home/stu2:/bin/bash
  5. stu3:x:533:533::/home/stu3:/bin/bash
  6. stu4:x:534:534::/home/stu4:/bin/bash
  7. stu5:x:535:535::/home/stu5:/bin/bash
  8. … …

步骤二:批量删除用户账号stu1-stu20

针对前面执行uaddwhile.sh脚本批量添加的用户账号,再建立一个批量删除这些账号的脚本udelwhile.sh。结构类似,只要替换为删除相关的操作即可。

脚本编写参考如下:

  1. [root@svr5 ~]# vim udelwhile.sh
  2. #!/bin/bash
  3. PREFIX="stu"
  4. i=1
  5. while [ $i -le 20 ]
  6. do
  7. userdel -r ${PREFIX}$i &> /dev/null
  8. let i++
  9. done
  10. [root@svr5 ~]# chmod +x udelwhile.sh

执行脚本并验证结果:

  1. [root@svr5 ~]# ./udelwhile.sh
  2. [root@svr5 ~]# grep ^stu /etc/passwd                 //再检查已无相应账号信息
  3. [root@svr5 ~]#

步骤三:检测192.168.4.0/24网段,列出不在线的主机地址

1)任务需求及思路分析

要求的是“检测192.168.4.0/24网段,列出不在线的主机地址”。

检测目标是一个网段,其网络部分“192.168.4.”可以作为固定的前缀;而主机部分包括从1~254连续的地址,所以可结合while循环和自增变量进行控制。

2)根据实现思路编写脚本

  1. [root@svr5 ~]# vim chknet.sh
  2. #!/bin/bash
  3. NET="192.168.4."
  4. i=1
  5. while [ $i -le 254 ]
  6. do
  7. IP="${NET}$i"
  8. ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
  9. if [ $? -eq 0 ] ; then
  10. echo "Host $IP is up."
  11. else
  12. echo "Host $IP is down."
  13. fi
  14. let i++
  15. done
  16. [root@svr5 ~]# chmod +x chknet.sh

3)测试、验证脚本

  1. [root@svr5 ~]# ./chknet.sh
  2. Host 192.168.4.1 is down.
  3. Host 192.168.4.2 is down.
  4. Host 192.168.4.3 is down.
  5. Host 192.168.4.4 is down.
  6. Host 192.168.4.5 is up.
  7. .. ..
  8. Host 192.168.4.250 is down.
  9. Host 192.168.4.251 is down.
  10. Host 192.168.4.252 is down.
  11. Host 192.168.4.253 is down.
  12. Host 192.168.4.254 is down.

case  变量值  in

模式1)

命令序列1 ;;

模式2)

命令序列2 ;;

    .. ..

*)

步骤一:编写脚本文件

脚本编写参考如下:

  1. [root@svr5 ~]# vim test.sh
  2. #!/bin/bash
  3. case $1 in
  4. redhat)
  5.         echo "fedora";;
  6. fedora)
  7.         echo "redhat";;
  8.     *)                                             //默认输出脚本用法
  9. echo "用法: $0 {redhat|fedora}"
  10. exit 1
  11. esac
  12. [root@svr5 ~]# chmod +x test.sh

步骤三:验证、测试脚本

未提供参数,或提供的参数无法识别时,提示正确用法:

  1. [root@svr5 ~]# ./test.sh
  2. 用法: ./test.sh {redhat|fedora}

确认可响应redhat控制参数:

  1. [root@svr5 ~]# ./test.sh redhat
  2. fedora

确认可响应fedora控制参数:

  1. [root@svr5 ~]# ./test.sh fedora
  2. redhat

 默认命令序列

Esac

function  函数名 {

命令序列

    .. ..

}

函数名() {

命令序列

    .. ..

}

1. [root@svr5 ~]# mycd(){                        //定义函数

2. > mkdir /test

3. > cd /test

4. > }

5. [root@svr5 ~]# mycd                            //调用函数

6. 

7. [root@svr5 ~]# mycd(){                        //定义函数

8. > mkdir $1

9. > cd $1

10. > }

11. [root@svr5 ~]# mycd  /abc                            //调用函数

12. [root@svr5 ~]# mycd  /360                            //调用函数

调用函数时,将用户提供的两个参数传递给函数处理。

2)根据实现思路编写脚本文件

  1. [root@svr5 ~]# vim funexpr.sh
  2. #!/bin/bash
  3. myexpr() {
  4. echo "$1 + $2 = $[$1+$2]"
  5. echo "$1 - $2 = $[$1-$2]"
  6. echo "$1 * $2 = $[$1*$2]"
  7. echo "$1 / $2 = $[$1/$2]"
  8. }
  9. myexpr $1 $2
  10. [root@svr5 ~]# chmod +x funexpr.sh

break可以结束整个循环;continue结束本次循环,进入下一次循环;exit结束整个脚本,案例如下:

1. [root@svr5 ~]# cat  /root/test.sh

2. #!/bin/bash

3. for  i   in   {1..5}

4. do

5.         if  [  $i  -eq  3 ];then

6.              break            #这里将break替换为continueexit分别测试脚本执行效果

7.         fi

8.         echo $i

9. done

10. echo 程序结束

阅读全文
0 0