Shell脚本应用(for、while循环语句和case分支语句卡

作者:电脑系统

             ;;

目标:

本案例要求编写两个Shell脚本,相关要求如下:

    • 一个funexpr.sh脚本:由用户在执行时提供2个整数值参数,计算这2个整数的加、减、乘、除结果

 分分快三全天计划网站 1

Shell脚本(for、while和case语句的应用示例)

一、for循环语句

1、根据姓名列表批量添加用户

步骤:首先创建一个姓名列表 vim /root/users.txt 然后创建脚本vim  uaddfor.sh批量添加用户

 分分快三全天计划网站 2

分分快三全天计划网站 3

授权并执行后查看用户是否已创建

 分分快三全天计划网站 4

2、根据ip地址列表检查主机状态

步骤:首先创建一个ip地址列表文件 vim /root/padds.txt 然后创建脚本vim chkhosts.sh

分分快三全天计划网站 5

分分快三全天计划网站 6

授权并执行

 分分快三全天计划网站 7

二、while循环语句

1、批量添加规律编号的用户

步骤:创建vim uaddwhile.sh脚本

分分快三全天计划网站 8

授权并执行后查看用户是否已创建

 分分快三全天计划网站 9

2、猜价格游戏

步骤:创建脚本vim pricegame.sh

分分快三全天计划网站 10

授权并执行

 分分快三全天计划网站 11

三、case分支语句

1、检查用户输入的字符类型

步骤:创建脚本vim hitkey.sh

分分快三全天计划网站 12

授权并执行

 分分快三全天计划网站 13

2、编写系统服务脚本

步骤:编写脚本 vim myprog

分分快三全天计划网站 14

分分快三全天计划网站 15

授权并执行

 分分快三全天计划网站 16

四、实验案例

1、编写getarp.sh脚本文件

(1)通过arping命令发送ARP请求,根据反馈结果记录MAC地址。

(2)将网段地址(如192.168.4.)赋值给变量NADD,作为检测地址的前缀。

(3)使用while循环语句,重复检测目标并记录MAC地址,主机地址从1-254。

脚本如下:

[root@localhost ~]# vi getarp.sh

#!/bin/bash

# 1. 定义网段地址、MAC列表文件

NADD="192.168.4."

FILE="/etc/ethers"

# 2. 发送ARP请求,并记录反馈结果

[ -f $FILE ] && /bin/cp -f $FILE $FILE.old       //备份原有文件

HADD=1                                           //定义起始扫描地址

while [ $HADD -lt 128 ]

do

    arping -c 2 -w 1 ${NADD}${HADD} &> /dev/null

    if [ $? -eq 0 ] ; then

       arp -n | grep ${NADD}${HADD} | awk '{print $1,$3}' >> $FILE

    fi

    let HADD

done

[root@localhost ~]# chmod x getarp.sh

[root@localhost ~]# ./getarp.sh               //执行检测程序

[root@localhost ~]# cat /etc/ethers               //确认记录结果

192.168.4.12 00:0C:29:C3:F8:51

192.168.4.110 00:50:56:C0:00:01

…… //省略部分内容

2、编写scanhost.sh脚本

(1)有很多方法可以检测一个主机是否开启匿名FTP服务,这里采取以wget下载工具访问FTP根目录的方式,若能够成功列表,则视为匿名FTP已开启,否则视为关闭。

(2)通过awk命令过滤出/etc/ethers文件中的所有IP地址,赋值给变量TARGET。

(3)使用for循环语句,读取TARGET变量中的IP地址,重复探测FTP开启情况。

脚本如下:

[root@localhost ~]# vi scanhost.sh

#!/bin/bash

TARGET=$(awk '{print $1}' /etc/ethers)

echo "以下主机已开放匿名FTP服务:"

for IP in $TARGET

do

    wget ftp://$IP/ &> /dev/null

        if [ $? -eq 0 ] ; then

            echo $IP

            rm -rf index.html                //删除测试产生的临时文件

        fi

done

[root@localhost ~]# chmod x scanhost.sh

[root@localhost ~]# ./scanhost.sh           //执行脚本,确认扫描结果

以下主机已开放匿名FTP服务:

192.168.4.110

192.168.4.129

 

 文章参考微信公众号:L宝宝聊IT

方案:

通过break、continue、exit在Shell脚本中实现中断与退出的功能。

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

    [root@svr5 ~]# cat  /root/test.sh
    #!/bin/bash
    for  i   in   {1..5}
    do
            if  [  $i  -eq  3 ];then
                 break            #这里将break替换为continue,exit分别测试脚本执行效果
            fi
            echo $i
    done
    echo 程序结束

For循环语句

l  读取不同的变量值,以逐个执行同一组命令

l  For语句结构

for 变量名 in 取值列表

do

        命令序列

done

l  for执行原理

for 变量=取值1,do命令序列。取值2,取值3…取值n,分别do。所有取值都执行完之后,done结束循环。

l  根据IP地址检查主机状态

Ip地址存放在ip.txt文件中

每行一个

使用ping命令检测各主机的联通性

l  根据ip地址检查主机状态脚本

[root@poll ~]# vi ip.txt

192.168.0.8 127.0.0.1

192.168.0.9

192.168.0.10

192.168.0.11

[root@poll ~]# vi chkhost.sh

#!/bin/bash

#this is chkhosts

hlist=$(cat /root/ip.txt)

for IP in $hlist

do

        ping -c 3 -i 0.2 -W 1 $IP &>/dev/null

        if [ $? -eq 0 ] ;then

                echo "host $IP is up"

        else

                echo "host $IP is down"

        fi

done

[root@poll ~]# sh chkhost.sh

host 192.168.0.8 is up

host 127.0.0.1 is up

host 192.168.0.9 is down

host 192.168.0.10 is down

host 192.168.0.11 is down

 

自制累加小脚本从1加到100

[root@poll ~]# seq -s " " 100 >>num.txt

[root@poll ~]# cat num.txt

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

[root@poll ~]# vi add.sh

#!/bin/bash

#description : 1 add 2 add 3 add ... add 100

a=$(cat /root/num.txt)

c=0

for b in $a

do     

        i=$b

        c=$(($i $c))

done

echo $c

[root@poll ~]# sh add.sh

5050

Let  i      let  i=i 1      i=`expr i 1`

步骤:

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

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

   脚本编写参考如下:

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

执行脚本并验证结果:

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

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

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

脚本编写参考如下:

    [root@svr5 ~]# vim udelwhile.sh
    #!/bin/bash
    PREFIX="stu"
    i=1
    while [ $i -le 20 ]
    do
        userdel -r ${PREFIX}$i &> /dev/null
        let i
    done
    [root@svr5 ~]# chmod x udelwhile.sh

执行脚本并验证结果:

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

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

1)任务需求及思路分析

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

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

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

    [root@svr5 ~]# vim chknet.sh
    #!/bin/bash
    NET="192.168.4."
    i=1
    while [ $i -le 254 ]
    do
        IP="${NET}$i"
        ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
        if [ $? -eq 0 ] ; then
            echo "Host $IP is up."
        else
            echo "Host $IP is down."
        fi
        let i
    done
    [root@svr5 ~]# chmod x chknet.sh

3)测试、验证脚本

    [root@svr5 ~]# ./chknet.sh
    Host 192.168.4.1 is down.
    Host 192.168.4.2 is down.
    Host 192.168.4.3 is down.
    Host 192.168.4.4 is down.
    Host 192.168.4.5 is up.
    .. ..
    Host 192.168.4.250 is down.
    Host 192.168.4.251 is down.
    Host 192.168.4.252 is down.
    Host 192.168.4.253 is down.
    Host 192.168.4.254 is down.

三、基于case分支编写脚本

目录结构:

case  变量值  in

步骤:

 

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

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

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

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

1)编写脚本如下:

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

2)测试、验证脚本

    [root@svr5 ~]# vim chkhosts.sh
    … …
    [root@svr5 ~]# ./chkhosts.sh
    Host 192.168.4.5 is up.
    Host 192.168.4.6 is down
    … …

二、使用while循环结构

While循环语句

l  重复测试某个条件,只要条件成立则反复执行

l  while 条件测试操作

do

        命令序列

done

l  while语句执行原理

while条件测试操作,条件成立,do命令序列。继续判断条件,成立就一直执行do命令序列。不成立就done结束循环。

 

l  批量添加用户

用户以stu开头,按数字顺序进行编号

一共添加20个用户,即stu1,stu2,…,stu20

初始密码均设为123123

 

实例

[root@poll ~]# vi useadd.sh

#!/bin/bash

#一共添加20个用户,即stu1,stu2,…,stu20

#初始密码均设为123123

perfix=stu

i=1

while [ $i -le 20 ]

do

        useradd $perfix$i

        echo "123123"|passwd --stdin ${perfix}$1 &>/dev/null

        i=$(($i 1))

done

 

esac

目标:

本案例要求编写一个Shell脚本chkhosts.sh,利用for循环来检测多个主机的存活状态,相关要求及说明如下:

      1> 对192.168.4.0/24网段执行ping检测
      2> ping检测可参考前一天的pinghost.sh脚本
      3> 脚本能遍历ping各主机,并反馈存活状态

执行检测脚本以后,反馈结果如下图所示。

                                                     分分快三全天计划网站 17

 

例:批量添加用户(stu1~stu20)

目标:

本案例要求编写test.sh脚本,相关要求如下:

       1> 能使用redhat、fedora控制参数
       2> 控制参数通过位置变量$1传入
       3> 当用户输入redhat参数,脚本返回fedora
       4> 当用户输入fedora参数,脚本返回redhat
       5> 当用户输入其他参数,则提示错误信息

 

语法:

方案:

 

在Shell脚本应用中,常见的for循环采用遍历式、列表式的执行流程,通过指定变量从值列表中循环赋值,每次复制后执行固定的一组操作。

 

for循环的语法结构如下所示:

    for  变量名  in  值列表
    do
        命令序列
    done

掌握for循环语句编程

done

目标:

本案例要求编写两个Shell脚本,相关要求如下:

      1> 从键盘循环取整数(0结束)并求和,输出最终结果
      2> 跳过1~20以内非6的倍数,输出其他数的平方值,设定退出代码为2

Shell编程之循环语句

             ;;

方案:

    case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。

    case分支的语法结构如下所示:

    case  变量值  in
    模式1)
        命令序列1 ;;
    模式2)
        命令序列2 ;;
        .. ..
    *)
        默认命令序列
    esac

学习目标:

i=1

步骤:

步骤一:编写funexpr.sh脚本

1)任务需求及思路分析

用户在执行时提供2个整数参数,这个可以通过位置变量$1、$2读入。

针对给定的两个整数,四则运算可以视为一组操作,可以定义为一个函数,依次负责加减乘除运算并输出结果。

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

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

    [root@svr5 ~]# vim funexpr.sh
    #!/bin/bash
    myexpr() {
        echo "$1 $2 = $[$1 $2]"
        echo "$1 - $2 = $[$1-$2]"
        echo "$1 * $2 = $[$1*$2]"
        echo "$1 / $2 = $[$1/$2]"
    }
    myexpr $1 $2
    [root@svr5 ~]# chmod x funexpr.sh

3)测试脚本执行效果

    [root@svr5 ~]# ./funexpr.sh  43  21
    43 21 = 64
    43 - 21 = 22
    43 * 21 = 903
    43 / 21 = 2
    [root@svr5 ~]# ./funexpr.sh 1234 567
    1234 567 = 1801
    1234 - 567 = 667
    1234 * 567 = 699678
    1234 / 567 = 2

五、中断及退出

掌握while循环语句编程

prefix=“stu”

步骤:

步骤一:编写脚本文件

脚本编写参考如下:

    [root@svr5 ~]# vim test.sh
    #!/bin/bash
    case $1 in
    redhat)
            echo "fedora";;
    fedora)
            echo "redhat";;
        *)                                              //默认输出脚本用法
        echo "用法: $0 {redhat|fedora}"
        exit 1
    esac
    [root@svr5 ~]# chmod x test.sh

步骤二:验证、测试脚本

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

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

确认可响应redhat控制参数:

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

确认可响应fedora控制参数:

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

四、使用Shell函数、中断及退出

 

模式1)

 

done

步骤:

步骤一:编写脚本sum.sh

1)编写脚本文件

    [root@svr5 ~]# vim sum.sh
    #!/bin/bash
    while  read  -p  "请输入待累加的整数(0表示结束):"     x
    do
        [ $x -eq 0 ]  &&  break
        SUM=$[SUM x]
    done
    echo "总和是:$SUM"
    [root@svr5 ~]# chmod x chkint.sh

步骤二:编写sum.sh脚本文件

1)编写脚本文件

    [root@svr5 ~]# vim mysum.sh
    #!/bin/bash
    i=0
    while  [ $i -le 20 ]
    do
        let i
        [ $[i%6] -ne 0 ]  &&  continue
        echo $[i*i]
    done
    exit 2
    [root@svr5 ~]# chmod x sum.sh

 

while 【条件测试 】

一、使用for循环结构

do

目标:

本案例要求编写三个使用while循环的脚本程序,分别实现以下目标:

       1> 批量添加用户账号:stu1-stu20
       2> 批量删除用户账号:stu1-stu20
       3> 检测192.168.4.0/24网段,列出不在线的主机地址

while条件为true:代表永远为真,死循环,必须使用exit或break命令才结束循环

方案:

在Shell脚本中,将一些需重复使用的操作,定义为公共的语句块,即可称为函数。通过使用函数,可以使脚本代码更加简洁,增强易读性,提高Shell脚本的执行效率

1)函数的定义方法

格式1:

    function  函数名 {
        命令序列
        .. ..
    }

格式2:

    函数名() {
        命令序列
        .. ..
    }

2)函数的调用

直接使用“函数名”的形式调用,如果该函数能够处理位置参数,则可以使用“函数名 参数1 参数2 .. ..”的形式调用。

注意:函数的定义语句必须出现在调用之前,否则无法执行。

3) 测试语法格式

    [root@svr5 ~]# mycd(){                        //定义函数
    > mkdir /test
    > cd /test
    > }
    [root@svr5 ~]# mycd                            //调用函数
    [root@svr5 ~]# mycd(){                        //定义函数
    > mkdir $1
    > cd $1
    > }
    [root@svr5 ~]# mycd  /abc                            //调用函数
    [root@svr5 ~]# mycd  /360                            //调用函数

for  变量值  in  取值列表

方案:

   while循环属于条件式的执行流程,会反复判断指定的测试条件,只要条件成立即执行固定的一组操作,直到条件变化为不成立为止。所以while循环的条件一般通过变量来进行控制,在循环体内对变量值做相应改变,以便在适当的时候退出,避免陷入死循环。

   while循环的语法结构如下所示:

    while  条件测试
    do
        命令序列
    done

done

语法:

        命令序列

            默认命令序列

模式2)

         添加更改测试条件语句

while 【 $i  -le  20 】

*)

取值时,中括号【】,代表任选其一 ,横杠 - ,代表取值范围,竖杠 | ,代表或者

         命令

3、case:针对变量的不同取值,分别执行不同的命令序列

   useradd  ${prefix}$i

do

1、for:读取不同的变量值,逐个执行同一组命令,直到取值完毕退出,变量值以空格分隔

必须进行递增,避免死循环:方法:

             命令序列1

   let  i

2、while:重复测试某个条件,成立则执行,进入下一个循环,直到条件不成立为止

   echo  “123456”  |  passwd  --stdin ${prefix}$i  &> /dev/null

do

语法:

             ……

             命令序列2

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划