For,while,case,shell循环结构

案例1:使用for循环结构

案例2:使用while循环结构

案例3:基于case分支编写脚本

案例4:使用Shell函数

案例5:中断及退出

1案例1:使用for循环结构

1.1问题

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

对192.168.4.0/24网段执行ping检测

ping检测可参考前一天的pinghost.sh脚本

脚本能遍历ping各主机,并反馈存活状态

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

图-1

1.2方案

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

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

for变量名in值列表

do

命令序列

done

For 变量名in `ls/etc/*.conf`

do

命令序列

done

for变量名 in {1..5}

do

命令序列

done

for变量名 in `seq 5`

do

命令序列

done

1.3步骤

实现此案例需要按照如下步骤进行。

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

脚本1,通过循环批量显示10个hello world:

[root@svr5~]#vim for01.sh

#!/bin/bash

for i in {1..10}

do

echo "hello world"

done

[root@svr5~]#chmod +x for01.sh

[root@svr5~]#./for01.sh

脚本2,通过循环批量显示10个数字:

[root@svr5~]#vim for02.sh

#!/bin/bash

for i in {1..10}

do

echo "$i"

done

[root@svr5~]#chmod +x for02.sh

[root@svr5~]#./for01.sh

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

1)编写脚本如下:

命令备注:ping命令可以测试某台主机的连通性,

使用-c选项可以设置ping的次数,

使用-i选项可以设置多次ping之间的间隔时间(单位秒),

使用-W选项可以设置ping不通时的超时时间(单位秒)。

[root@svr5~]#vim chkhosts.sh

#!/bin/bash

for i in {1..254}

do

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

if [ $? -eq 0 ];then

echo "Host 192.168.4.$i is up."

else

echo "Host 192.168.4.$i is down."

fi

done

[root@svr5~]#chmod +x chkhosts.sh

2)测试、验证脚本

……

[root@svr5~]#./chkhosts.sh

Host 192.168.4.5 is up.

Host 192.168.4.6 is down

……


案例2:使用while循环结构

2.1问题

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

提示用户猜测一个随机数,直到才对为止

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

2.2方案

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

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

while条件测试

do

命令序列

done

2.3步骤

实现此案例需要按照如下步骤进行。

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

脚本1,无心的死循环脚本:

[root@svr5~]#vim while01.sh

#!/bin/bash

i=1

while [ $i -le 5 ]

do

echo "$i"

done

[root@svr5~]#chmod +x while01.sh

[root@svr5~]#./while01.sh//死循环,需要使用Ctrl+C终止脚本

脚本2,有效循环脚本:

[root@svr5~]#vim while02.sh

#!/bin/bash

i=1

while [ $i -le 5 ]

do

echo "$i"

let i++

done

[root@svr5~]#chmod +x while02.sh

[root@svr5~]#./while02.sh

脚本3,死循环的一般格式:

[root@svr5~]#vim while03.sh

#!/bin/bash

while:

do

echo "hello world"

done

[root@svr5~]#chmod +x while03.sh

[root@svr5~]#./while03.sh//死循环,需要使用Ctrl+C终止脚本

步骤二:提示用户猜测一个随机数,直到才对为止

使用系统自带变量RANDOM提取随机数(1-100),使用while:制作死循环。

脚本编写参考如下:

[root@svr5~]#vim guess.sh

#!/bin/bash

num=$[RANDOM%100+1]

i=0

while:

do

read -p "随机数1-100,你猜:" guess

let i++ //猜一次,计数器加1,统计猜的次数

if [ $guess -eq $num ];then

echo "恭喜,猜对了"

echo "你猜了$i次"

exit

elif [ $guess -gt $num ];then

echo "猜大了"

else

echo "猜小了"

fi

[root@svr5~]#chmod +x guess.sh

执行脚本并验证结果:

[root@svr5~]#./guess.sh

步骤三:检测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

i=1

while [ $i -le 254 ]

do

IP="192.168.4.$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.


案例3:基于case分支编写脚本

3.1问题

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

能使用redhat、fedora控制参数

控制参数通过位置变量$1传入

当用户输入redhat参数,脚本返回fedora

当用户输入fedora参数,脚本返回redhat

当用户输入其他参数,则提示错误信息

3.2方案

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

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

case变量值in

模式1)

命令序列1;;

模式2)

命令序列2;;

....

*)

默认命令序列

esac

3.3步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本文件

脚本编写参考如下:

[root@svr5~]#vim test.sh

#!/bin/bash

case $1 in

redhat)

echo "fedora";;

fedora)

echo "redhat";;

*)//默认输出脚本用法

echo "用法:$0{redhat|fedora}"

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函数

4.1问题

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

将颜色输出的功能定义为函数

调用函数,可以自定义输出内容和颜色

4.2方案

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

4.3步骤

实现此案例需要按照如下步骤进行。

步骤一:编写mycolor.sh脚本

1)任务需求及思路分析

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

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

颜色输出的命令:echo-e"\033[32mOK\033[0m"。

3X为字体颜色,4X为背景颜色。

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

[root@svr5~]#vim mycolor.sh

#!/bin/bash

cecho(){

echo -e "\033[$1m$2\033[0m"

}

cecho 32 OK

cecho 33 OK

cecho 34 OK

cecho 35 OK

[root@svr5~]#chmod +x mycolor.sh

3)测试脚本执行效果

[root@svr5~]#./mycolor.sh


案例5:中断及退出

5.1问题

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

从键盘循环取整数(0结束)并求和,输出最终结果

跳过1~20以内非6的倍数,输出其他数的平方值,设定退出代码为2

5.2方案

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

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

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

#!/bin/bash

for i in {1..5}

do

[ $i -eq 3 ] && break //这里将break替换为continue,exit分别测试脚本执行效果echo $i

done

echo "Game Over"

5.3步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本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

For,while,case,shell循环结构的更多相关文章

  1. shell循环结构解析:for/while/case

    1.for循环结构 for var in item1 item2 ... itemN do command1 command2 ... commandN done 例如,顺序输出当前列表中的数字: # ...

  2. shell 循环结构

    前言 循环结构在编程中十分常见,也是程序中是较为重要的一部分,在bash中有 for,until,while 这三种语句可以进行重复执行部分程序流程,下面会进一步讨论这三个指令的使用以及注意事项 fo ...

  3. PL/SQL 流程控制语句-条件结构,循环结构

    条件结构 一.IF-THEN语句 IF-THEN语句是最简单的IF语句. 语法: IF condition THEN Statements END IF; 例子: declare v_score nu ...

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

    一.使用for循环结构 目标: 本案例要求编写一个Shell脚本chkhosts.sh,利用for循环来检测多个主机的存活状态,相关要求及说明如下: 1> 对192.168.4.0/24网段执行 ...

  5. Shell脚本中的for case while循环流程控制语句的使用

    shell作为一种脚本编程语言,同样包含循环.分支等其他程序控制结构,从而轻松完成更加复杂.强大的功能. 编写脚本的思路 1  明确脚本的功能 2  编写脚本时会使用到那些命令 ?   3  把变化的 ...

  6. shell的编程结构体(函数、条件结构、循环结构)

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 shell函数 在shell中,函数可以被当作命令一样 ...

  7. shell条件控制和循环结构

    一.简介 Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for.while和until.while循环和for循环属于“当型循环”,而until属于“直到 ...

  8. shell分支与循环结构

    1. 条件选择 1.1 条件判断分支介绍 格式 if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMM ...

  9. shell脚本--循环结构

    shell的循环结构有while和for两种 for循环 #!/bin/bash #文件名:test.sh i=4 for i in 2 4 6 8 10 do echo $i done echo $ ...

随机推荐

  1. 【JDK】JDK源码分析-Semaphore

    概述 Semaphore 是并发包中的一个工具类,可理解为信号量.通常可以作为限流器使用,即限制访问某个资源的线程个数,比如用于限制连接池的连接数. 打个通俗的比方,可以把 Semaphore 理解为 ...

  2. tomcat Http11NioProtocol如何解析http请求及如何解决TCP拆包粘包

    前言 tomcat是常用的Web 应用服务器,目前国内有很多文章讲解了tomcat架构,请求流程等,但是没有如何解析http请求及如何解决TCP粘包拆包,所以这篇文章的目的就是介绍这块内容,一下内容完 ...

  3. WPF转换器之值转换器

    WPF有两转转换器,一种是值转换器,另一种多值转换器,在开发过程中经常会从数据拉一些数据过来,比如存储性别的时候往往会用0或1,但在界面上肯定是要显示男或女,那么这个时候就可以用上值转换器 编写转换器 ...

  4. 组件/ 外层数据初始化时候,不应该触发 on-change 事件

    组件/ 外层数据初始化时候,不应该触发 on-change 事件 watch: { value (value) { this.noOnChange = true // 外层传值 不触发on-chang ...

  5. iOS开发:UIColor转成纯色图片(UIImage)

    Objective-c 版本 UIKIT_EXTERN UIImage * __nullable UIColorAsImage(UIColor * __nonnull color, CGSize si ...

  6. 脏牛提权CVE-2016-5195

    gcc -pthread dirtyc0w.c -o dirtyc0w 尝试使用gcc -pthread dirtyc0w.c -o dirtyc0w 编译该POC文件 gcc命令是一个编译器套件,可 ...

  7. 优秀DevOps工程师必会的33个面试题

    DevOps面试问题 01 您能告诉我们DevOps和Agile(敏捷)之间的根本区别吗? 答:尽管DevOps与敏捷方法(这是最流行的SDLC[Software Development Life C ...

  8. 【codeforces】Codeforces Round #606 E. Two Fairs——图论

    题目链接 题意 给你一张无向图,求出有多少对点对(x, y)满足从点x到点y的所有路径必同时经过点a和点b 分析 单点 首先考虑假如点a和点b是同一个点的情况 我从任意的一点出发,把所有与点a/b相连 ...

  9. GBDT梯度提升树算法及官方案例

    梯度提升树是一种决策树的集成算法.它通过反复迭代训练决策树来最小化损失函数.决策树类似,梯度提升树具有可处理类别特征.易扩展到多分类问题.不需特征缩放等性质.Spark.ml通过使用现有decisio ...

  10. python win32com

    要使用Python控制MS Word,您需要先安裝win32com套件,這個套件可以到 http://sourceforge.net/projects/pywin32/ 找到.本文假設您已經正確安裝w ...