循环编程的三种结构.doc_第1页
循环编程的三种结构.doc_第2页
循环编程的三种结构.doc_第3页
循环编程的三种结构.doc_第4页
循环编程的三种结构.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第18章shell编程循环401第18章shell编程循环目标完成此章学习后,你将掌握下列内容:n 使用while结构,在某条件保持为真的情况下重复执行一段代码。n 使用until结构,重复执行一段代码,直到某条件为真。n 使用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.3while结构注释while结构是shell提供的一个循环机制,当某条件为真的时候,循环执行shell的一段命令(list B)。这个条件是否为真由list A最后一个命令的返回码决定。常常使用test 或let命令控制循环,但任何其他可以产生返回码的命令都可以用来控制循环。本节幻灯片中的例子可以用let命令代替test命令来控制循环,如下所示:$X=1$while $X -le 10 do echo hello X is $X let X=X+1 done其执行情况如下:(1) 执行list A中的命令。(2) 如果list A 中最后一个命令的返回码为0(true),那么执行list B。(3) 返回第一步。(4) 如果list A 中最后一个命令的返回码不是0(false),跳到紧接done之后的第一个命令。While结构流程图如图18-1所示。图18-1 While结构流程图警告 注意使用无限性while循环。有些循环的控制命令永远返回真。$ cat while_infinitewhile truedoecho hellodone$ while_infinitehellohello . . .Ctrl + c 18.4while结构例子注释本节幻灯片演示了while结构的另外两个例子。例A演示的是:提示用户输入一个值,然后根据用户的反应决定是否继续循环。例B演示的是:循环检验命令行中的每个参数。如果参数是一个目录,则显示该目录的内容。如果参数不是一个目录,则跳过该参数。请注意,使用shift这个命令可以一个接一个地访问每一个参数。当它与while命令结合使用时,会使循环结构变得很灵活。无论有1个还是100个参数,循环会继续进行,直到所有的参数被访问完毕。应该注意的是如果想最少执行一次循环,可能需要建立一个while循环。例A将至少执行一次循环体,因为例A中的ans已经被设置成等同于yes。在例B里,如果这个程序不带例A中的命令行参数($#=0)执行,那么将不执行这个循环。18.5until结构注释until结构是shell提供的另一种循环机制,这个结构中的命令系列(list B)会保持循环运行,直到某条件为真。与while结构相似,这个条件是否为真由list A最后一个命令的返回码决定。本节幻灯片中例子的执行情况如下:(1)执行list A中的命令。(2)如果list A 中最后一个命令的返回码不为0(false),那么执行list B。(3)返回第一步。(4)如果list A 中最后一个命令的返回码为0(true),跳到紧接done之后的第一个命令。until结构流程图如图18-2所示。图18-2 until 结构流程图警告 注意使用无限until循环。有些循环的控制命令永远返回真。$ X=1$ until $X -eq 0 do echo hello donehellohello . . .Ctrl + c 18.6until结构例子注释本节幻灯片例子的内容与在while结构中演示的一样,但这里用until结构来实现。注意必须将while结构中测试条件的逻辑反过来,这样才能符合until结构测试条件的逻辑。还要注意:until结构对用户输入的敏感度与while结构相比,发生了微小的变化。在while结构中,用户只有输入字符串yes,这个循环才会继续进行。继续循环的条件非常严格。而在until结构中,用户输入的字符串只要不是no,这个循环都会继续进行。until结构对于继续循环施加的条件,没有while结构那么严格。当你决定哪种结构最适合你的需要时,你可以将这些问题考虑在内。在上面的例子中,是否预定义ans变量的值并不太重要,因为这个变量会被初始化为NULL。由于NULL不等于no,测试条件会返回false,于是可以开始执行循环。你只需确认在测试表达式中用双引号将$ans括起来以符合test命令语法。18.7for结构注释本节幻灯片中的例子有几个关键字:for、in、do、done。var代表一个shell 变量,它的数值在for循环的执行过程中决定。list是由空格或tab键分隔的一系列字符串,在for循环的执行过程中这些字符串将被分配给var。这个结构的执行情况如下:(1) 将shell变量var的值设为list中的第一个字符串。(2) 执行命令list A。(3) 将shell变量var的值设为list中的下一个字符串。(4) 执行命令list A。(5) 继续循环直到list中所有项都被赋给变量var。for结构流程图如图18-3所示。图18-3for结构流程图18.8for结构 例子注释for结构是一个非常灵活的循环结构。它可以循环访问shell创建的任何参数列表。通过命令替换,能够很容易地创建一个参数列表。由于管道和过滤器提供的功能,几乎可以由任何东西产生一个参数列表。如果想多次访问同一个列表,应该将这个列表保存在一个文件中。然后用cat命令调用这个文件,生成一个参数列表供for循环结构使用。$cat studentsuser1user2user3user4$cat for_students_file_copyfor NAME in $(cat students)docp test.file /home/$NAMEchown $NAME /home/$NAME/test.filechmod g-w,o-w /home/$NAME/test.fileecho done $NAMEdone$访问命令行参数可以以命令行参数创建一个列表,如:for i in $*do cp $i $HOME/backupsdone或者for i docp $i $HOME/backupsdone18.9break、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 cmd1do cmdA cmdB while cmdCdo cmdE reak 2 cmdFdonecmdJcmdKdonecmdX(1) break 2之后执行的是哪一个命令?(2) 如果将break 2替换为break,break之后执行的是哪一个命令?(3) 如果将break 2替换为continue 2,continue 2之后执行的是哪一个命令?(4) 如果将break 2替换为continue,continue之后执行的是哪一个命令?18.10break和continue命令例子注释这个例子说明了break和continue命令的巨大作用。本节幻灯片所示的例子中,while循环的检测条件永远为真,说明这是一个无限循环,除非循环体里面有某命令(break命令可以做到这点)可以终止这个循环。当输入的文件名并不代表一个普通文件时,会显示出一个错误信息,然后continue命令提示用户再次输入文件名。如果文件名代表一个普通文件,该文件会被删除,这时break命令的作用是跳出这个无限循环。18.11shell编程 循环总结18.12实验:shell编程 循环指导完成下列练习并回答相关问题。1创建一个名为double_it的程序,这个程序提示用户输入一个数值,然后在屏幕显示这个数的双倍值。2创建一个名为sum_them的程序,这个程序提示用户输入10个数值。程序会将这10个数值相加,然后显示相加的结果(提示:每次输入一个数值时,将结果累加)。附加:修改sum_them,使用户输入数值的个数由一个命令行参数决定。如:sum_them 6 则指提示用户输入6个数值。3创建一个名为words_in的程序,这个程序循环提示用户每次输入一个单词,直到输入quit这个单词为止。当用户输入quit后,显示用户曾经输入的所有单词。用while结构能不能完成这个练习?用until结构呢?选择你喜欢的一种结构(附加:按字母表的顺序显示用户曾经输入的所有单词)。4在一个shell程序中,创建一个for 循环,这个循环可以:n 创建目录Adir、Bdir、Cdir、Ddir、Edir。n 将文件funfile拷贝到以上每个目录下。n 列出以上每个目录的内容以确认拷贝成功。n 当每次循环结束时,显示一条信息。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秒检查一下某特定用户是否已经登录进本系统。用户名作为命令行参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论