Shell基础(三):使用for循环结构、使用while循环结构、基于case分支编写脚本、使用Shell函数、中断及退出

一、使用for循环结构

目标:

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

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

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

方案:

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

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

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

步骤:

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

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

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

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

1)编写脚本如下:

[[email protected] ~]# 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
    [[email protected] ~]# chmod +x chkhosts.sh

2)测试、验证脚本

[[email protected] ~]# vim chkhosts.sh
    … …
    [[email protected] ~]# ./chkhosts.sh
    Host 192.168.4.5 is up.
    Host 192.168.4.6 is down
    … …

二、使用while循环结构

目标:

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

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

方案:

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

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

while  条件测试
    do
        命令序列
    done

步骤:

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

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

脚本编写参考如下:

[[email protected] ~]# 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
    [[email protected] ~]# chmod +x uaddwhile.sh

执行脚本并验证结果:

[[email protected] ~]# vim uaddwhile.sh
     [[email protected] ~]# ./uaddwhile.sh
    [[email protected] ~]# 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。结构类似,只要替换为删除相关的操作即可。

脚本编写参考如下:

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

执行脚本并验证结果:

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

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

1)任务需求及思路分析

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

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

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

[[email protected] ~]# 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
    [[email protected] ~]# chmod +x chknet.sh

3)测试、验证脚本

[[email protected] ~]# ./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分支编写脚本

目标:

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

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

方案:

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

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

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

步骤:

步骤一:编写脚本文件

脚本编写参考如下:

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

步骤二:验证、测试脚本

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

[[email protected] ~]# ./test.sh
    用法: ./test.sh {redhat|fedora}

确认可响应redhat控制参数:

[[email protected] ~]# ./test.sh redhat
    fedora

确认可响应fedora控制参数:

[[email protected] ~]# ./test.sh fedora
    redhat

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

目标:

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

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

方案:

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

1)函数的定义方法

格式1:

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

格式2:

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

2)函数的调用

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

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

3) 测试语法格式

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

步骤:

步骤一:编写funexpr.sh脚本

1)任务需求及思路分析

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

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

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

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

[[email protected] ~]# 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
    [[email protected] ~]# chmod +x funexpr.sh

3)测试脚本执行效果

[[email protected] ~]# ./funexpr.sh  43  21
    43 + 21 = 64
    43 - 21 = 22
    43 * 21 = 903
    43 / 21 = 2
    [[email protected] ~]# ./funexpr.sh 1234 567
    1234 + 567 = 1801
    1234 - 567 = 667
    1234 * 567 = 699678
    1234 / 567 = 2

五、中断及退出

目标:

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

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

方案:

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

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

[[email protected] ~]# 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 程序结束

步骤:

步骤一:编写脚本sum.sh

1)编写脚本文件

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

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

1)编写脚本文件

[[email protected] ~]# 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
    [[email protected] ~]# chmod +x sum.sh

原文地址:https://www.cnblogs.com/baichuanhuihai/p/8250960.html

时间: 2024-08-11 22:35:16

Shell基础(三):使用for循环结构、使用while循环结构、基于case分支编写脚本、使用Shell函数、中断及退出的相关文章

shell基础二十篇

shell基础二十篇 编者按:由 wingger  整理的 shell基础十二篇 以及L_kernel补充的第十三--二十篇,涉及shell 编程及使用的各个方面,又附有大量的例子,极适合初学者系统学习.如果配合網中人的shell 十三問? ,效果更加明显. 这里是其中的第十章 sed.  其他各章可察看相应的 link. shell基础1:文件安全与权限 http://bbs.chinaunix.net/thread-434579-1-1.html 附:Linux的用户和用户组管理 http:

shellwhile循环,C-for循环,until循环,case分支结构,流程控制语句

while 循环结构 while 条件判断表达式 do 条件判断成立时执行的语句块 ...... ...... done 例:使用while循输出数字1到10(升序输出) j=1 while [ $j -le 10 ] do #useradd wsyht$j #userdel -r wsyht$i echo $j let j++   #j=j+1 done C-for循环结构 for((赋初值;条件判断;步长)) do 条件判断成立时执行的操作 ...... done for((i=1;i<=5

shell 入门基础三

    linux shell 编程 1什么是bash shell 变量 shell变量可分为两类: 局部变量和环境变量. 局部变量只在创建它们的shell中可用.而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用.有些变量是用户创建的,其他的则是专用shell变量.变量名必须以字母或下划线字符开头.其余的字符可以是字母.数字(0~9)或下划线字符.任何其他的字符都标志着变量名的终止.名字是大小写敏感的.给变量赋值时,等号周围不能有任何空白符.为了给变量赋空值,可以在等号后跟一

EnjoyingSoft之Mule ESB基础系列第三篇:Mule message structure - Mule message结构

目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5. Mule的Variable 6. 使用Java操作Mule Message Mule ESB是一个使用Java语言编写的开源企业服务总线,企业服务总线英文Enterprise Service Bus,简称ESB.其相关源代码也托管在GitHub上,可以在https://github.com/mu

shell基础 变量 条件测试 判断结构

Top NSD ENGINEER DAY02 案例1:Shell脚本的编写及测试 案例2:重定向输出的应用 案例3:使用特殊变量 案例4:编写一个判断脚本 案例5:编写一个批量添加用户脚本 1 案例1:Shell脚本的编写及测试 1.1 问题 本例要求两个简单的Shell脚本程序,任务目标如下: 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello World!!” 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的

【Linux系列】【基础版】第三章 Shell基础知识

3. Shell基础知识     3.1 Shell的由来         3.1.1 Bourne Agin Shell         3.1.2 其他的shell, 有 zsh, ksh等     3.2 查看有没有shell         3.2.1 yum list | grep zsh         3.2.2 ls /root/.bash_history         3.2.3 echo $HISTSIZE -> vi /etc/profile 修改HISTSIZE的值 -

shell基础及流程控制语句之一while循环

前面写过if条件判断,一般在写shell脚本时可能会用到死循环这时就需要while语句了,它是做死循环最好的方法,在讲while循环之前需要讲文件测试,因为在写脚本时经常会用到. 文件测试: -e $file:判断是否存在如果存在则为真,不存在则为假 -f $file:判断是否存在并且为普通文件,存在为真,不存在为假 -d $file:判断是否存在并且为目录,存在为真不存在为假 -h $file:判断是否存在并且为符号链接文件(软连接),存在为真,不存在为假 -L $file:与-h一样不做解释

java基础三种循环的使用及区别

摘要:Java新人初学时自己的一些理解,大神们路过勿喷,有什么说的不对不足的地方希望能给予指点指点,如果觉得可以的话,希望可以点一个赞,嘿嘿,在这里先谢了.在这里我主要说的是初学时用到的Java三个循环体的用法及区别:for  while和do while在什么时候会使程序代码更方便简洁: 一.for循环体,这个在我以后写程序代码都是比较长用的一个循环体之一,for循环主要多数用到我们已经知道循环次数的循环程序中. 表达式:for(初始化:布尔表达式:更新){ 程序代码....... } for

Shell脚本 (三)for循环 while循环 case分支语句

################for循环语句的结构#############使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环.在这里,取值表 称为for语句的执行条件,其中包括多个属性相同的对象.需要预先指定(如通讯录.IP黑名单)·语法样式for 变量名 in 取值列表do 命令序列done·#####for循环语句列子####需求:根据人事部门给出的员工姓名拼音列表,在Linux服务器中添加相应的用户账号,初始密码均设