循环编程的三种结构.docx
- 文档编号:12287778
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:19
- 大小:151.04KB
循环编程的三种结构.docx
《循环编程的三种结构.docx》由会员分享,可在线阅读,更多相关《循环编程的三种结构.docx(19页珍藏版)》请在冰豆网上搜索。
循环编程的三种结构
第18章 shell编程——循环
目标
完成此章学习后,你将掌握下列内容:
⏹使用while结构,在某条件保持为真的情况下重复执行一段代码。
⏹使用until结构,重复执行一段代码,直到某条件为真。
⏹使用for结构,遍历由空白区分隔的一串参数。
18.1 循环——介绍
注释
使用循环结构可以重复执行一个命令序列,就和分支结构一样,关键命令的返回码决定继续还是停止执行循环语句。
test命令常常用来控制循环语句是否继续执行。
分支结构的起始点是一个关键词,终点是该关键词的倒序词(if/fi和case/esac),循环结构与分支结构不同,它起始于一个关键词和一个条件,循环体被包围在do和done中间。
18.2 用let命令做数学表达式运算
注释
通常shell通过递增一个数值型变量的值来控制循环语句。
在shell脚本中let命令可以使用数学表达式,它支持长整型变量。
该命令的语法如本节幻灯片所示,expression是一个表达式,可以代表shell变量和操作符。
将表达式括在(())里面的相当于let命令。
shell能辨认的操作符如表18-1所示,按优先级从低到高排列。
表18-1
操作符
描述
-
单操作符负号
!
逻辑非
*/%
乘、除、余数
+-
加、减
<=>=
关系型比较
==!
=
等于、不等于
=
分配数值
可以用括号改变一个表达式的计算顺序,如:
let“x=x/(y+1)”
应该注意的是:
很有必要使用双引号使括号的特殊意义失效。
同样,如果在表达式里有空格,在使用let命令或者(())时必须用双引号:
let“x=x+(y/2)”或者((x=x+(y/2))
当使用逻辑操作符和关系操作符(!
、<=、>=、<、>、==、!
=)时,shell的返回值变量——?
,会显示运算结果是true还是false(0代表true,1代表false)。
同样,还是要用双引号防止shell将小于等于号和大于等于号理解为输入输出重定向符。
18.3 while结构
注释
while结构是shell提供的一个循环机制,当某条件为真的时候,循环执行shell的一段命令(listB)。
这个条件是否为真由listA最后一个命令的返回码决定。
常常使用test或let命令控制循环,但任何其他可以产生返回码的命令都可以用来控制循环。
本节幻灯片中的例子可以用let命令代替test命令来控制循环,如下所示:
$ X=1
$ while[$X-le10]
>do
>echohelloXis$X
>letX=X+1
>done
其执行情况如下:
(1)执行listA中的命令。
(2)如果listA中最后一个命令的返回码为0(true),那么执行listB。
(3)返回第一步。
(4)如果listA中最后一个命令的返回码不是0(false),跳到紧接done之后的第一个命令。
While结构流程图如图18-1所示。
图18-1While结构流程图
警告
注意使用无限性while循环。
有些循环的控制命令永远返回真。
$catwhile_infinite
while
true
do
echohello
done
$while_infinite
hello
hello
.
.
.
Ctrl+c
18.4 while结构——例子
注释
本节幻灯片演示了while结构的另外两个例子。
例A演示的是:
提示用户输入一个值,然后根据用户的反应决定是否继续循环。
例B演示的是:
循环检验命令行中的每个参数。
如果参数是一个目录,则显示该目录的内容。
如果参数不是一个目录,则跳过该参数。
请注意,使用shift这个命令可以一个接一个地访问每一个参数。
当它与while命令结合使用时,会使循环结构变得很灵活。
无论有1个还是100个参数,循环会继续进行,直到所有的参数被访问完毕。
应该注意的是如果想最少执行一次循环,可能需要建立一个while循环。
例A将至少执行一次循环体,因为例A中的ans已经被设置成等同于yes。
在例B里,如果这个程序不带例A中的命令行参数($#=0)执行,那么将不执行这个循环。
18.5 until结构
注释
until结构是shell提供的另一种循环机制,这个结构中的命令系列(listB)会保持循环运行,直到某条件为真。
与while结构相似,这个条件是否为真由listA最后一个命令的返回码决定。
本节幻灯片中例子的执行情况如下:
(1)执行listA中的命令。
(2)如果listA中最后一个命令的返回码不为0(false),那么执行listB。
(3)返回第一步。
(4)如果listA中最后一个命令的返回码为0(true),跳到紧接done之后的第一个命令。
until结构流程图如图18-2所示。
图18-2until结构流程图
警告
注意使用无限until循环。
有些循环的控制命令永远返回真。
$X=1
$until
> [$X-eq0]
>do
> echohello
>done
hello
hello
.
.
.
Ctrl+c
18.6 until结构——例子
注释
本节幻灯片例子的内容与在while结构中演示的一样,但这里用until结构来实现。
注意必须将while结构中测试条件的逻辑反过来,这样才能符合until结构测试条件的逻辑。
还要注意:
until结构对用户输入的敏感度与while结构相比,发生了微小的变化。
在while结构中,用户只有输入字符串yes,这个循环才会继续进行。
继续循环的条件非常严格。
而在until结构中,用户输入的字符串只要不是no,这个循环都会继续进行。
until结构对于继续循环施加的条件,没有while结构那么严格。
当你决定哪种结构最适合你的需要时,你可以将这些问题考虑在内。
在上面的例子中,是否预定义ans变量的值并不太重要,因为这个变量会被初始化为NULL。
由于NULL不等于no,测试条件会返回false,于是可以开始执行循环。
你只需确认在测试表达式中用双引号将$ans括起来以符合test命令语法。
18.7 for结构
注释
本节幻灯片中的例子有几个关键字:
for、in、do、done。
var代表一个shell变量,它的数值在for循环的执行过程中决定。
list是由空格或tab键分隔的一系列字符串,在for循环的执行过程中这些字符串将被分配给var。
这个结构的执行情况如下:
(1)将shell变量var的值设为list中的第一个字符串。
(2)执行命令listA。
(3)将shell变量var的值设为list中的下一个字符串。
(4)执行命令listA。
(5)继续循环直到list中所有项都被赋给变量var。
for结构流程图如图18-3所示。
图18-3 for结构流程图
18.8 for结构——例子
注释
for结构是一个非常灵活的循环结构。
它可以循环访问shell创建的任何参数列表。
通过命令替换,能够很容易地创建一个参数列表。
由于管道和过滤器提供的功能,几乎可以由任何东西产生一个参数列表。
如果想多次访问同一个列表,应该将这个列表保存在一个文件中。
然后用cat命令调用这个文件,生成一个参数列表供for循环结构使用。
$ catstudents
user1
user2
user3
user4
$ catfor_students_file_copy
forNAMEin$(catstudents)
do
cptest.file/home/$NAME
chown$NAME/home/$NAME/test.file
chmodg-w,o-w/home/$NAME/test.file
echodone$NAME
done
$
访问命令行参数
可以以命令行参数创建一个列表,如:
foriin$*
do
cp$i$HOME/backups
done
或者
fori
do
cp$i$HOME/backups
done
18.9 break、continue和exit命令
注释
有些情况下需要在循环的正常终止条件实现之前切断这个循环。
break和continuet命令可以无条件地改变命令执行的流向。
当某错误发生时,常常用这两个命令终止当前循环。
当出现无法恢复的局面时,可以用exit命令,这时整个程序的执行会结束。
break命令会导致循环结束,程序控制转向紧接done关键字后面的命令。
通过break命令,能够立即跳出指定的循环,接着执行循环体后面的命令。
continue命令与break命令稍微有所不同。
程序执行到continue语句时,会跳过循环体里面剩余的命令,然后回到循环体的顶部。
因此,continue命令可以结束当前一次循环,但是,还会回到被中断的循环体的顶部,重新开始循环。
在while和until循环中,程序会回到初始化列表的开始处继续进行;而loop循环会将变量设为列表中的下一个变量值,然后继续执行。
exit命令会结束执行某段shell程序,而且,如果指定了一个参数值,这个参数值会作为该shell程序的返回值。
如果没有指定参数值,紧接exit命令之前的命令的返回值将作为该shell程序的返回值。
return命令的作用和一个shell程序段里的exit命令是一样的。
注意
一般情况下,应该通过循环体顶部(while、loop)的条件控制,或者通过遍历列表(for)来终止执行循环体。
仅当循环中出现非正常条件或者错误的条件,才应当使用上面提到的几个中断命令。
例子
while
cmd1
do
cmdA
cmdB
while
cmdC
do
cmdE
reak2
cmdF
done
cmdJ
cmdK
done
cmdX
(1)break2之后执行的是哪一个命令?
(2)如果将break2替换为break,break之后执行的是哪一个命令?
(3)如果将break2替换为continue2,continue2之后执行的是哪一个命令?
(4)如果将break2替换为continue,continue之后执行的是哪一个命令?
18.10 break和continue命令——例子
注释
这个例子说明了break和continue命令的巨大作用。
本节幻灯片所示的例子中,while循环的检测条件永远为真,说明这是一个无限循环,除非循环体里面有某命令(break命令可以做到这点)可以终止这个循环。
当输入的文件名并不代表一个普通文件时,会显示出一个错误信息,然后continue命令提示用户再次输入文件名。
如果文件名代表一个普通文件,该文件会被删除,这时break命令的作用是跳出这个无限循环。
18.11 shell编程——循环——总结
18.12 实验:
shell编程——循环
指导
完成下列练习并回答相关问题。
1.创建一个名为double_it的程序,这个程序提示用户输入一个数值,然后在屏幕显示这个数的双倍值。
2.创建一个名为sum_them的程序,这个程序提示用户输入10个数值。
程序会将这10个数值相加,然后显示相加的结果(提示:
每次输入一个数值时,将结果累加)。
附加:
修改sum_them,使用户输入数值的个数由一个命令行参数决定。
如:
sum_them6则指提示用户输入6个数值。
3.创建一个名为words_in的程序,这个程序循环提示用户每次输入一个单词,直到输入quit这个单词为止。
当用户输入quit后,显示用户曾经输入的所有单词。
用while结构能不能完成这个练习?
用until结构呢?
选择你喜欢的一种结构(附加:
按字母表的顺序显示用户曾经输入的所有单词)。
4.在一个shell程序中,创建一个for循环,这个循环可以:
⏹创建目录Adir、Bdir、Cdir、Ddir、Edir。
⏹将文件funfile拷贝到以上每个目录下。
⏹列出以上每个目录的内容以确认拷贝成功。
⏹当每次循环结束时,显示一条信息。
5.编写一个名为new_files的shell程序,该程序可以接受可变数目的命令行参数,按照每个参数创建一个以该参数为名的新文件(用touch命令),每创建一个新文件时显示一条信息通知用户创建成功。
6.用vi命令创建一个名为mailtest的文件。
在shell提示符下创建一个与系统交互的for循环,这个循环用来将文件mailtest邮寄给已经登录的每一个用户(提示:
用who和cut命令结合命令替换功能创建这个for循环的列表)。
7.创建一个名为my_menu的shell程序,该程序将显示一个只有3个选项的简单菜单。
(1)选第一个选项将运行double_it(习题1)。
(2)选第二个选项将运行sum_them(习题2)。
(3)退出。
除非用户选择的是退出,否则执行完用户选择的选项后,这个菜单要重新显示。
8.创建一个名为msg_me的shell程序,该程序将在1分钟内每隔5秒钟向你的屏幕发送一条消息(提示:
查阅一下sleep命令)。
也许你应该将消息的内容存在一个独立的文本文件里,这样修改这个消息会很容易。
9.编写一个名为ison的shell程序,该程序在后台运行,每隔60秒检查一下某特定用户是否已经登录进本系统。
用户名作为命令行参数传递给ison程序。
当该用户登录进去之后,你的终端屏幕会打印出一条消息告诉你该用户已经登录,以及该用户登录所用的终端(提示:
用sleep命令)。
如果你所在的系统在网络中是独立的,你也许须试一试rwho这个命令。
10.在主目录下创建一个名为.waste的目录。
编写一个名为myrm的shell程序,这个程序可以将要删除的文件移到.waste目录下,这个目录是你的回收站。
这是一个非常有用的工具,可以用来恢复已经删除的文件。
记住:
UNIX系统没有取消删除(undelete)的功能。
myrm包括以下选项:
⏹-l列举回收站的内容。
⏹-d删除回收站的内容。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 编程 结构