《控制脚本流程》_第1页
《控制脚本流程》_第2页
《控制脚本流程》_第3页
《控制脚本流程》_第4页
《控制脚本流程》_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

控制脚本流程整理ppt引言如何测试表达式的逻辑值?如何设计分支结构?如何设计循环结构?【问题的提出】Geecy软件开发公司的开发人员Tom所开发的通讯录管理脚本phone.sh的改进版本如下:tom@geecy:~$catphone.sh↙#!/bin/bashreadCount<count_file.txtecho"[${Count}]:"echo-n"Enteryourname:"readNameecho-n"Enteryourphonenumber:"readPhoneecho"$Count:$Name:$Phone">>file.txtCount=$((Count+1))echo$Count>count_file.txt./phone.sh【问题的提出】(续)该版本比旧版本已经有了很大的改进,能够满足一般的使用。但是根据Tom的开发经验,该版本至少存在四大缺陷: (1)脚本运行的稳定性不高,因为该脚本严重依赖于辅助文件count_file.txt,一旦该文件被以外破坏,该脚本将不能正常工作; (2)运行性能不高,因为该脚本在运行过程中需要频繁读写三个文件,而从该脚本的功能来看,运行过程中需要频繁读写的文件应该只有数据文件“file.txt”; (3)功能单一,因为目前只有增加功能,还缺乏基本的搜索功能; (4)用户界面不够友好,应该使用菜单式的用户界面。 因此Tom需要继续改进该脚本。【问题分析】如果要提高稳定性,就要想办法避免使用辅助文件count_file.txt。最大值就在数据文件file.txt的最后一行的第一个数据域。只需要想办法在增加一行新数据之前把该值读出来,然后增加一,就可以构造出下一个编号。命令tail,能够从一个文本文件的最后一行起,连续抽取若干行数据显示到屏幕。【问题分析】(续)如果上述的稳定性问题解决了,那么只需要避免使用脚本的递归调用就可以实现整个运行过程只需要频繁读写一个文件,即数据文件file.txt。只要找到能够重复运行某一部分脚本的替代方法,那么脚本的递归调用这种方法就可以“退役”了。【问题分析】(续)对于搜索功能的实现,可以使用grep命令来完成。【问题分析】(续)菜单式的用户界面的实现原理,就是首先打印若干个菜单项的内容到屏幕上,等待用户选择其中一个功能,脚本程序根据用户的键盘输入来判断用户的选择,从而进行相应功能的操作。然后重复。测试表达式test命令能够对表达式进行测试并求出True或False的逻辑值。例如: test$Name="Linus"test命令的语法要求被测试的表达式中的比较运算符(例如这里的“=”)的左右两边必须有空格。测试表达式(续)test命令可以一次测试多个表达式。这些表达式之间需要使用选项“-a”或“-o”连接。例如:

test$Name="Linus"-a$Country="China"为了有更好的可读性,用户可以使用方括号“[]”来代替test命令。例如:

[$Name="Linus"]设计分支结构分支结构提供给用户一种流程控制的能力,能够让用户根据某些条件作出判断,然后有所选择地执行某些语句。使用if语句和case语句都可以实现分支结构。设计分支结构(续)if语句的基本格式为: if<Condition> then <Commands1> else <Commands2> fi设计分支结构(续)#!/bin/bashecho-n"Doyouknowtheanswer?(y/n)"readResultif[$Result="y"]then echo"Good!" echo"Congratulations!"else echo"Bad!" echo"Workhard!"fiecho"Finished!"设计分支结构(续)case语句的基本格式为: case<Variable>in Pattern1) <Commands1> ;; Pattern2) <Commands2> ;; ...... *) <Commands> ;; esac设计分支结构(续)#!/bin/bashecho-n"Enteraword(dozenorscore):"readStrcase$Strindozen)echo"12";;score)echo"20";;*)echo"Itisneitheradozennorascore.";;esac测试字符串对字符串的测试,除了测试是否相等,还有其他的一些常用的测试。选项作用string如果string的长度不为零,则值为True,否则为False-zstring如果string的长度为零,则值为True,否则为FalseString1=String2如果string1与string2相等,则值为True,否则为FalseString1!=String2如果string1与string2不相等,则值为True,否则为False测试算术式Shell的变量是字符串类型,如果要把变量的内容作为数值进行比较,则需要使用算术测试选项。选项作用-eq等于(Equal)-ne不等于(NotEqual)-gt大于(GreaterThen)-ge大于(GreaterThen)或等于(Equal)-lt小于(LessThen)-le小于(LessThen)或等于(Equal)测试文件选项作

用-eFile如果文件File存在(Exist),则为True-sFile如果文件File存在且文件大小(Size)大于零,则为True-fFile如果文件File存在且是普通文件(File),则为True-dFile如果文件File存在且是目录(Directory),则为True-bFile如果文件File存在且是块(Block)特殊文件,则为True-cFile如果文件File存在且是字符(Character)特殊文件,则为True-LFile如果文件File存在且是符号链接(Link)文件,则为True测试文件(续)选

项作

用-rFile如果文件File存在且是可读的(Readable),则为True-wFile如果文件File存在且是可写的(Writable),则为True-xFile如果文件File存在且是可执行的(Executable),则为True-OFile如果文件File存在且属于当前用户(Owner),则为True-GFile如果文件File存在且属于当前用户组(Group),则为TrueFile1–ntFile2如果文件File1新于(NewerThen)File2,则为TrueFile1–otFile2如果文件File1旧于(OlderThen)File2,则为True设计循环结构循环结构提供了重复执行一段脚本的能力。脚本程序可以使用两种风格的循环语句来实现循环结构:while循环和for循环。设计循环结构(续)使用while语句的格式是:

while<Condition> do <Commands> done设计循环结构(续)#!/bin/bashCount=1while[$Count-le10]doecho$CountCount=$((Count+1))done设计循环结构(续)for语句实现循环结构的一种格式是:

for((Expression1;Expression2;Expression3))do <Commands>done设计循环结构(续)#!/bin/bashfor((Count=1;Count<=10;Count=Count+1))doecho$Countdone设计循环结构(续)for语句实现循环结构的另一种格式是:

for<Variable>in<List> do <Commands> done设计循环结构(续)#!/bin/bashforFileNamein`ls~`doif[-f~/$FileName]thenecho"Thecontentsof~/${FileName}is:"cat~/$FileNamefiDone【解决方案】#!/bin/bashFile="file.txt"if[-s$File]thenCount=`tail-n1file.txt|cut-d":"-f1`Count=$((Count+1))elseCount="1001"fi【解决方案】(续)whiletruedoclearecho"[0].Exit"echo"[1].Addphonenumber"echo"[2].Searchnameorphonenumber"echo-n"Yourchoice(0,1or2):"readKeycase$Keyin0)exit;;【解决方案】(续)1)clearecho"[${Count}]:"echo-n"Enteryourname:"readNameecho-n"Enteryourphonenumber:"readPhoneecho"$Count:$Name:$Phone">>file.txtCount=$((Count+1));;【解决方案】(续)2)clearecho-n"Inputakeyword:"readWordcleargrep$Word$Fileecho"Pressentertocontinue..."readEnter;;esacDone练习1、编写一个Shell脚本,从键盘读入5个整数。然后显示最大数、最小数以及平均值。2、编写一个Shell脚本,显示Fibonacci数列的前20项。例如: 0,1,1,2,3,5,8,13,21...练习(续)3、编写一个Shell脚本,从键盘上接收两个文件名,如果两个文件都存在则交换两个文件的内容,否则应给出出错信息。4、编写一个shell脚本,产生并输出如下的序列:

1,2,3,2,3,4,3,4,5,4,5,6…98,99,100练习(续)5、Cell宽带数据公司的客户服务中心对值班员工的工作质量进行跟踪评价,评价标准是客户对值班员工的“满意”投票数量与总投票数量的比值。如下表所示: Tenny需要编写一个shell脚本,读入“满意”投票数量和总投票数量,然后计算并输出相应的评定等级。比

值(%)等

级Lessthen70AverageBetween70and95GoodGreaterthen95Excellent练习(续)6、Cell宽带数据公司向客户提供一种菜单式的查询服务,如下表所示: Tenny需要编写一个shell脚本,显示服务菜单。当客户选择某一项服务后输出相应的服务内容。序

号服

称服

容1查询费用(Billquer

温馨提示

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

评论

0/150

提交评论