shell编制程序之循环语句,使用while循环结构

2019-05-03 22:36 来源:未知

Shell编制程序之循环语句

1、for:读取分歧的变量值,每一个试行同样组命令,直到取值完结退出,变量值以空格分隔

一、使用for循环结构

读书目的:

韦德国际1946官网,语法:

 

精通for循环语句编制程序

for  变量值  in  取值列表

目标:

本案例供给编写制定2个Shell脚本chkhosts.sh,利用for循环来检查测试两个主机的幸存状态,相关供给及表达如下:

      1> 对1九二.16捌.四.0/24网段施行ping检验
      2> ping检验可参考前一天的pinghost.sh脚本
      ③> 脚本能遍历ping各主机,并申报存活状态

实施行检查测脚本现在,反馈结果如下图所示。

                                                     韦德国际1946官网 1

左右while循环语句编制程序

do

方案:

 

在Shell脚本应用中,常见的for循环选择遍历式、列表式的施行流程,通过点名变量从值列表中循环赋值,每一回复制后实践一定的1组操作。

 

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

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

 

        命令系列

步骤:

 

手续1:演练for循环基本用法

剧本一,通过轮回读取账户文件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

手续2:批量检查实验四个主机的共处状态

一)编写脚本如下:

    [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

二)测试、验证脚本

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

2、使用while循环结构

目录结构:

done

目标:

该案例供给编辑四个利用while循环的脚本程序,分别完成以下目的:

       一> 批量增添用户账号:stu1-stu20
       二> 批量删除用户账号:stu一-stu20
       3> 检查评定192.16八.4.0/贰四网段,列出不在线的主机地址

 韦德国际1946官网 2

贰、while:重复测试某些条件,创建则进行,进入下三个巡回,直到条件不树立截止

方案:

   while循环属于条件式的实行流程,会频仍决断钦点的测试条件,只要条件建登时进行一定的1组操作,直到条件变化为不树立停止。所以while循环的标准化一般通过变量来展花费配,在循环体内对变量值做相应改造,以便在适用的时候退出,防止陷入死循环。

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

    while  条件测试
    do
        命令类别
    done

 

语法:

步骤:

步骤1:批量抬高用户账号stu一-stu20

   增加的账号有定点的前缀stu(演练中可机关安装),五个账号从一伊始编号,比方stu1、stu二、stu三、……、stu20。—— 编写脚本uaddwhile.sh,落成批量加多那二十个用户账号的功用,密码均设为12345陆。

   脚本编写参考如下:

    [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
    … …

步骤二:批量删减用户账号stu一-stu20

针对前面推行uaddwhile.sh脚本批量抬高的用户账号,再建构2个批量删减这几个账号的脚本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.16捌.四.0/贰4网段,列出不在线的主机地址

1)职责需求及思路分析

渴求的是“检查评定192.168.四.0/贰肆网段,列出不在线的主机地址”。

检查测试对象是二个网段,其互联网部分“1九贰.16八.肆.”能够看做稳定的前缀;而主机部分包涵从一~25四一连的地方,所以可组合while循环和自增变量实行支配。

二)依据兑现思路编写脚本

    [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

三)测试、验证脚本

    [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.

3、基于case分支编写脚本

 

while 【条件测试 】

目标:

此案例要求编辑test.sh脚本,相关供给如下:

       1> 能使用redhat、fedora调节参数
       贰> 调节参数通过岗位变量$一传入
       叁> 当用户输入redhat参数,脚本重回fedora
       四> 当用户输入fedora参数,脚本再次来到redhat
       伍> 当用户输入任何参数,则提示错误音讯

For循环语句

l  读取差异的变量值,以各种实行一样组命令

l  For语句结构

for 变量名 in 取值列表

do

        命令序列

done

l  for实行原理

for 变量=取值1,do命令系列。取值2,取值叁…取值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

 

自制累加小脚本从一加到十0

[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

do

方案:

    case分支属于异常推行的章程,它针对钦点的变量预先安装二个或者的取值,判定该变量的莫过于取值是不是与预设的某贰个值相相配,假如相称上了,就进行相应的壹组操作,纵然未有任何值能够同盟,就施行预先设置的默许操作。

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

    case  变量值  in
    模式1)
        命令体系一 ;;
    模式2)
        命令系列贰 ;;
        .. ..
    *)
        默许命令种类
    esac

While循环语句

l  重复测试有个别条件,只要条件创设则往往实施

l  while 条件测试操作

do

        命令体系

done

l  while语句施行原理

while条件测试操作,条件创设,do命令系列。继续衡量准则,创设就直接执行do命令体系。不树立就done甘休循环。

 

l  批量抬高用户

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

计算增多十多个用户,即stu壹,stu二,…,stu20

伊始密码均设为1231贰三

 

实例

[root@poll ~]# vi useadd.sh

#!/bin/bash

#合计增添21个用户,即stu1,stu2,…,stu20

#开端密码均设为1231贰3

perfix=stu

i=1

while [ $i -le 20 ]

do

        useradd $perfix$i

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

        i=$(($i 1))

done

 

         命令

步骤:

步骤一:编写脚本文件

剧本编辑撰写参考如下:

    [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

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

         增添改换测试条件语句

目标:

该案例供给编写制定三个Shell脚本,相关须要如下:

    • 一个funexpr.sh脚本:由用户在试行时提供3个整数值参数,总计那三个整数的加、减、乘、除结果

done

方案:

在Shell脚本中,将部分需重复使用的操作,定义为集体的语句块,就能够称为函数。通过动用函数,能够使脚本代码特别简明,巩固易读性,提升Shell脚本的施行功能

壹)函数的定义方法

格式1:

    function  函数名 {
        命令种类
        .. ..
    }

格式2:

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

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                            //调用函数

例:批量抬高用户(stu一~stu20)

步骤:

步骤一:编写funexpr.sh脚本

一)职分须求及思路分析

用户在进行时提供3个整数参数,那个能够经过岗位变量$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

伍、中断及退出

prefix=“stu”

目标:

该案例供给编写制定七个Shell脚本,相关须要如下:

      1> 从键盘循环取整数(0说尽)并求和,输出最后结果
      2> 跳过1~20以内非⑥的翻番,输出别的数的平方值,设定退出代码为2

i=1

方案:

透过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 程序截止

while 【 $i  -le  20 】

步骤:

手续1:编写脚本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

手续2:编写sum.sh脚本文件

一)编写脚本文件

    [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

 

do

   useradd  ${prefix}$i

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

   let  i

done

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

务必实行递增,防止死循环:方法:

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

三、case:针对变量的分歧取值,分别施行区别的通令系列

语法:

case  变量值  in

模式1)

             命令种类一

             ;;

模式2)

             命令体系二

             ;;

             ……

*)

            暗中同意命令系列

esac

取值时,中括号【】,代表任选其1 ,横杠 - ,代表取值范围,竖杠 | ,代表大概

Shell脚本(for、while和case语句的选用示范)

1、for循环语句

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

步骤:首先创设1个姓名列表 vim /root/users.txt 然后创立脚本vim  uaddfor.sh批量增多用户

 韦德国际1946官网 3

韦德国际1946官网 4

授权并实施后翻看用户是不是已创制

 韦德国际1946官网 5

二、依据ip地址列表检查主机状态

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

韦德国际1946官网 6

韦德国际1946官网 7

授权并施行

 韦德国际1946官网 8

二、while循环语句

壹、批量拉长规律编号的用户

步骤:创建vim uaddwhile.sh脚本

韦德国际1946官网 9

授权并实践后翻看用户是还是不是已创建

 韦德国际1946官网 10

二、猜价格游戏

手续:成立脚本vim pricegame.sh

韦德国际1946官网 11

授权并施行

 韦德国际1946官网 12

三、case分支语句

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

手续:创设脚本vim hitkey.sh

韦德国际1946官网 13

授权并实施

 韦德国际1946官网 14

二、编写系统服务脚本

步骤:编写脚本 vim myprog

韦德国际1946官网 15

韦德国际1946官网 16

授权并执行

 韦德国际1946官网 17

四、实验案例

一、编写getarp.sh脚本文件

(一)通过arping命令发送ARP请求,依据反映结果记录MAC地址。

(2)将网段地址(如1九2.16八.4.)赋值给变量NADD,作为检查评定地址的前缀。

(三)使用while循环语句,重复检查测试对象并记录MAC地址,主机地址从1-25四。

剧本如下:

[root@localhost ~]# vi getarp.sh

#!/bin/bash

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

NADD="192.168.4."

FILE="/etc/ethers"

# 贰. 殡葬ARP请求,并记下反馈结果

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

HADD=一                                           //定义早先扫描地址

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地址,赋值给变量TARAV四GET。

(三)使用for循环语句,读取TA福特ExplorerGET变量中的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

TAG标签: 韦德娱乐1946
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于韦德国际1946官网,转载请注明出处:shell编制程序之循环语句,使用while循环结构