




免费预览已结束,剩余71页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章UNIX文件系统高级操作8.1shell读写文件,UNIX系统的标准流当程序读、写数据,视为来自数据源的流、去向目的地(数据汇)的流。数据源、汇可以是文件、设备、内存或是网络连接等,想象数据在这其中“流”动一样。在UNIX系统中,文件(按字节组织)之间,设备之间的信息传递是按字节流完成的。因此信息流的概念在UNIX中很重要。,8.1.1命令处理流,由命令处理即“加工”,要输入和输出的信息可以看作信息流。如果不考虑“信息流”中包含的具体内容,只关心“信息流”和“加工”之间的关系,我们可以将命令处理中的“信息流”描述为:“命令输入流”“命令输出流”,它们都属于命令处理流。8.1.2信息流,8.2shell输入输出重定向,默认状态下,shell将命令的输入流设定为键盘,输出流设定为显示器,错误流也定义为显示器。但是在有些情况下,我们可以改变这些流的设定。改变流的设定常用的符号有,ls.txt,ls-l/home/user1ls.txt,ls-l/home/user1ls.txt,8.2shell输入输出重定向,重定向符表示将标准输入从键盘重新定义到另外的流。例如:prog也能够混合使用,例如:progoutfile表示prog命令从infile中获取命令参数,然后将执行结果输出到文件outfile中。,8.3错误流重定向,在UNIX系统中,错误信息流是指在命令或程序执行中出现错误时系统给出的提示或警告信息,UNIX中将它们作为一个独立的标准输出流进行定义,错误信息流通常定义为显示器。当然,用户也可以根据需要对它进行重定向。不同的shell在这方面有所不同。,Cshell中使用的错误流重定向符是:;1234567)echoGoodafternoon!;*)echoGoodevening!;esac,12.4条件控制语句,例:利用shell的位置变量参数编写一个shell,当只有一个参数时,从键盘输入文本保存到data.txt中,当有两个参数时,将参数1代表的文件内容添加到参数2表示的文件,其他情况则给出错误提示信息,#append.shcase$#in1)catdata.txt;2)cat$1$2;*)echoIncorrectusage!;esac,12.5循环语句,shell中的循环有for、while和until循环方式。1)for的语法格式为:forvarinlist-of-varsdo命令组donefor的语法说明为:shell程序扫描变量列表list-of-vars,将其中的每一个字依次存放在var中,并执行do和done之间的语句。如果list-of-vars中有n个字,则这个for循环将执行n次。,12.5循环语句,在需要的时候,也可以进行for循环的嵌套。见下面的例子:cd$HOMEfordirinccworkdoecho“.In$dir.”cd$dirforfilein*.cdolsl$filedonecddone,12.5循环语句,2)while循环whiledodone结构while循环结构,每次先判断循环条件,为真则执行一次循环体(重复执行部分),轮到下次。否则结束循环(整体结构)。格式:whileconditiondo命令组done,12.5循环语句,3)until循环untildodoneuntil循环和while循环类似,所不同的是until循环是循环终止条件。为假,才做(重复执行部分)循环体的执行。格式:untilconditiondo命令组done如果第一次执行时,循环条件condition就为真,那循环体将得不到执行。同时还要注意,必须在程序中设置条件condition为真的因素,否则循环将一直进行下去,从而进入了死循环。,12.5循环语句,例:编写shell程序一次性创建若干个新文件,如file1,file2,file3.file10。需要了解两个相关命令,touch命令,改变文件的访问和修改时间格式:touchoptiontimefilename,option-a只修改文件的访问时间-m只修改文件的修改时间当指定文件filename不存在,则创建一个具有默认权限和当前时间的新文件,time格式MMDDHHMM,expr命令,对shell变量进行算术运算的操作,因为shell变量的值都是字符型,进行算术运算必须使用expr命令,其带有三个参数运算符两边要有空格。涉及算术运算+、-、*、/和%运算。,12.5循环语句,shell中错误的算术运算:#count=9#count=$count+11#echocount,系统将显示:9+11,shell中正确的算术运算:#count=9#count=expr$count+11#echocount,系统将显示:20,#genfiles.sh编程实现NUMBER=1Whiletest$NUMBERlt11dotouchfile$NUMBERNUMBER=expr$NUMBER+1done,12.6Shell程序调试,shell程序是一种解释性语言,它的执行是逐行进行的,程序中是否有语法错误,不执行到那一行系统是无法知道的。C,pascal等高级语言是有编译过程的,程序中的语法错误在编译阶段就能检测出来,因此比shell更容易调试shell程序通常有三种调试方法:,1)交互式调试shell程序中使用的命令都能在命令行中运行,所以对于一些不很熟悉的命令和语法可以先用命令进行验证,然后再编写到shell程序中,这种调试方法称为交互式调试,也是最简单的一种调试方法。,12.6Shell程序调试,2)在编辑过程中不断调试执行所编辑的shell程序在UNIX系统中可以打开多个工作窗口。我们可以在一个窗口中用vi等编辑器进行编辑,然后在另一个连接窗口中执行该shell程序,这样可以随时观察到已经编写的部分是否正确。最终完成这个shell程序的编写。,3)用shell程序提供的跟踪功能进行调试shell程序可以使用-v-x选项对shell程序进行跟踪-v:当读入shell输入行时把它们显示出来,完成详细跟踪。Shell程序在完成这段程序执行时首先逐行读入执行的命令,并在标准输出上显示该命令要执行的实际内容,然后执行该命令。如果没有语法错误,执行将一直进行下去直到完成shell的执行。-x:执行命令前先把命令和它们的参数显示出来,12.6Shell程序调试,假设有这么一个简单的shell,叫test1.shdateecho$PATH我们用-v参数来调试,执行sh-vtest1.sh那么输出就应该是:dateMonSep89:55:01Linux92003echo$PATH/usr/bin:/usr/ucb/bin:/home/user1shell在执行date前先显示该命令然后显示date的执行结果,接着显示echo$PATH以及它的执行结果。,如果用-x参数来执行这个shell,执行sh-xtest1.sh则系统的输出将是:+dateMonSep89:55:01Linux92003+echo/usr/bin:/usr/ucb/bin:/home/user1/usr/bin:/usr/ucb/bin:/home/user1date这一行没有参数,所以只显示命令echo这一行有参数$path,被直接替换成了参数的值。,12.6Shell程序调试,在调试一个比较大的shell时,没有必要对整个shell程序都进行跟踪,可以只对其中较为集中关注的部分进行跟踪,这时可以通过setvset+v或者setxset+x来把需要跟踪的部分包含进来。,1.使用for循环语句编写Bshell程序,完成显示用户注册目录下a_sub,b_sub子目录下的所有C程序源文件和目标文件的列表,12.7Shell编程示例,#showCfile.shiftest-d$HOME/a_subthenecho-the.cand.objfilesin$HOME/a_sub:-forfilenameinls$HOME/a_subdocase$filenamein*.c)echo$filename;*.obj)echo$filename;esacdoneelseecho$HOME/a_subdoesnotexist!fi,12.7Shell编程示例,iftest-d$HOME/b_subthenecho-the.cand.objfilesin$HOME/b_sub:-forfilenameinls$HOME/b_subdocase$filenamein*.c)echo“$filenameisaCsourcefile!”;*.obj)echo“$filenameisanObjectfile!”;esacdoneelseecho$HOME/b_subdoesnotexist!fi,12.7Shell编程示例,2.连续输入若干个名字到文件s中保留read当Bsh遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数,Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分隔的一个字母和数字组成的字符串。可以通过重定向的方式从文件中读字符串。,ans=yesuntiltest$ans=nodoechoEnteranamereadnameecho$sechoContinue?echoEnteryesornoreadansdone,12.7Shell编程示例,whiletest-rabc.txtdoechofileabc.txthasnotbeendeleted!“sleep10doneechofileabc.txthasbeeddeleted!,3.持续检测文件abc.txt是否存在,12.7Shell编程示例,count=0whilereadLINEdocount=expr$count+1done$1;2)cat$2;3)cat$1$2$3;*)echoTomanyparamesac,iftest$#-eq1thencat$1elif$#=2thencat$2elif$#=3thencat$1$2$3elseechoerrorfi,12.7Shell编程示例,6.为了便于系统管理员对磁盘分配的管理,请编写一段shell程序,当文件系统/home的占用空间量改变时,给出相应的信息提示。要求/home占用量在系统磁盘中为:1)小于50%时,提示“用户系统文件磁盘使用负荷量小”。2)大于50%,小于90%时,提示“用户文件系统磁盘使用负荷量正常”3)大于90%时,提示“用户文件系统磁盘使用负荷量偏大”。,12.7Shell编程示例,bc一个简单的计算器。bc是一个支持交互的表达式计算的语言,其格式类似于C语言输入bc,回车,就进入bc的命令行,输入一个C格式的计算式1333,回车得到结果100命令行echo1+33*3|bc也能计算出1333100。scalen计算的精度du显示文件或目录所用的磁盘空间(另外观察df)-s只显示设定文件目录的空间总量-r如果文件不能读取,则显示出提示信息-a可以接收多个文件,并一一显示所占的磁盘空间,rootredhat#df-kFilesystem1k-blocksUsedAvailableUse%Mountedon/dev/hda255423081147592411318022%/none25665202566520%/dev/shmrootredhat#,命令df,功能:报告磁盘空间使用情况,及空闲的空间等格式:dfoptionresource注:resource表示选定的系统资源。选项option说明,,-k:以k字节为单位-m:以m字节为单位-T:显示文件系统类型-h:以便于理解的方式显示大小,文件系统,dfTh,FilesystemTypeSizeUsedAvailUse%Mountedon/dev/hda2ext35.3G1.1G3.9G22%/nonetmpfs251M0250M0%/dev/shmrootredhat#,文件系统类型,linux常用的类型有ext2,ext3等,参考windows的ntfs,fat32等,虚拟内存文件系统,该文件系统大小,以k为单位计算,已用空间,可用空间,已用空间百分率,文件系统mount点,命令du,功能:报告文件系统的可用空间,即任何目录(可包含子目录)或(其中)文件使用的空间情况。格式:duoption文件名选项option说明:-a:全部,每个目录和文件的情况-s:总计,指明目录的总计情况-r:报告,不能打开文件的原因,命令:tail整数cb文件名给出文件尾部指定行数(或字符数或块数)内容。命令head类似。,12.7Shell编程示例,echoecho-DiskUsageCondition-used_disk=du-s/home|cut-f1echoUsedBlocks:$used_diskfree_disk=df|head2|tail-1|tr-s|cut-f4-dechoFreeBlocks:$free_disktotal_disk=expr$used_disk+$free_diskechototalblocks:$total_diskechoecho-diskusageratio-,12.7Shell编程示例,#计算出磁盘的利用率ratio=echoscale=6;$used_disk*100/$total_disk|bcecho-eusageratio:$ratio%iftestexpr$ratio90thenecho用户文件系统磁盘使用负荷偏大elseecho用户文件系统磁盘使用负荷正常fiecho,12.7Shell编程示例,7.编写一个shell程序:根据从键盘输入的学生成绩,显示相应的成绩标准。,echo-ePleaseenterthescore:whilereadSCOREdocase$SCOREin?|1-5?)echoFailed!echoPleaseenterthenextscore:;6?)echoPassed!echoPleaseenterthenextscore:;7?)echoMedium!echoPleaseenterthenextscore:;8?)echoGood!echoPleaseenterthenextscore:;9?|100)echoGreat!echoPleaseenterthenextscore:;*)exit;esacdone,12.7Shell编程示例,8.假设文件score.txt中保存了三个班级的学生成绩,编写一段shell程序来计算3个班级的学生数目和平均成绩。,#!/bin/sh#Averaterscore.shSCORE1=0SCORE2=0SCORE3=0NUMBER1=0NUMBER2=0NUMBER3=0SAVED_IFS=$IFSIFS=:INPUT_FILE=score.txt,whilereadNAMECLASSSCORE#循环读入各行docase$CLASSinclass1)NUMBER1=expr$NUMBER1+1SCORE1=expr$SCORE1+$SCORE;class2)NUMBER2=expr$NUMBER2+1SCORE2=expr$SCORE2+$SCORE;class3)NUMBER3=expr$NUMBER3+1SCORE3=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-河北-河北公路养护工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-江西-江西动物检疫员二级(技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏动物检疫员一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西电工一级(高级技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西林木种苗工二级(技师)历年参考题库含答案解析
- 焊工入门基础知识培训课件
- 2025年事业单位工勤技能-安徽-安徽收银员五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-安徽-安徽农业技术员二级(技师)历年参考题库典型考点含答案解析
- 热轧钢管基础知识培训课件
- 2025年职业技能鉴定-茶艺师-茶艺师四级(中级工)历年参考题库含答案解析(5套)
- 《螺纹的种类和应用》课件
- 医学一等奖《白血病》课件
- 发现普洱茶的第一个医学实验报告
- 全自动血液细胞分析仪参数
- (完整版)过去完成时ppt
- 1输变电工程施工质量验收统一表式(线路工程)
- 养老护理员(技师、高级技师)知识考试复习题库(含答案)
- 学校安全“日管控、周排查、月总结”工作制度
- 机械原理课程设计15吨压片机设计
- 2023年五四青年节演讲比赛PPT担负青年使命弘扬五四精神PPT课件(带内容)
- 2023年义务教育音乐2022版新课程标准考试测试题及答案
评论
0/150
提交评论