UNIXshell及其shell编程课件

上传人:磨石 文档编号:240738247 上传时间:2024-05-04 格式:PPT 页数:76 大小:283KB
返回 下载 相关 举报
UNIXshell及其shell编程课件_第1页
第1页 / 共76页
UNIXshell及其shell编程课件_第2页
第2页 / 共76页
UNIXshell及其shell编程课件_第3页
第3页 / 共76页
点击查看更多>>
资源描述
第八章第八章UNIX文件系统高级操作文件系统高级操作8.1 shell8.1 shell读写文件读写文件 UNIXUNIX系统的标准流系统的标准流 当程序读、写数据,视为来自数据源的流、去向目当程序读、写数据,视为来自数据源的流、去向目的地(数据汇)的流。数据源、汇可以是文件、设备、的地(数据汇)的流。数据源、汇可以是文件、设备、内存或是网络连接等,想象数据在这其中内存或是网络连接等,想象数据在这其中“流流”动一动一样。样。在在UNIXUNIX系统中,文件(按字节组织)之间,设备之系统中,文件(按字节组织)之间,设备之间的信息传递是按字节流完成的。因此信息流的概念间的信息传递是按字节流完成的。因此信息流的概念在在UNIXUNIX中很重要。中很重要。UNIXshell及其shell编程8.1.8.1.1 1 命令处理流命令处理流 由命令处理即由命令处理即“加工加工”,要输入和输出的信息可以看,要输入和输出的信息可以看作信息流。作信息流。如果不考虑如果不考虑“信息流信息流”中包含的具体内容,中包含的具体内容,只关心只关心“信息流信息流”和和“加工加工”之间的关系,我们可以将之间的关系,我们可以将命令处理中的命令处理中的“信息流信息流”描述为:描述为:“命令输入流命令输入流”“”“命令输出流命令输出流”,它们都属于命令处理流。,它们都属于命令处理流。8.1.8.1.2 2 信息流信息流文件描述符文件描述符 标准定义标准定义默认映射对象默认映射对象0 0标准输入流标准输入流stdinstdin键盘键盘1 1标准输出流标准输出流stdoutstdout 显示器显示器2 2标准错误流标准错误流stderrstderr 输出错误信息输出错误信息UNIXshell及其shell编程8.2 shell8.2 shell输入输出重定向输入输出重定向 默认状态下,默认状态下,shellshell将命令的输入流设定为键盘,将命令的输入流设定为键盘,输出流设定为显示器,错误流也定义为显示器。但是输出流设定为显示器,错误流也定义为显示器。但是在有些情况下,我们可以改变这些流的设定。改变流在有些情况下,我们可以改变这些流的设定。改变流的设定常用的符号有的设定常用的符号有,ls.txt ls-l ls.txt ls-l/home/user1 ls.txt ls-l/home/user1 ls.txt ls-l/home/user1 ls.txtls-l/home/user1 ls.txtUNIXshell及其shell编程8.2 shell8.2 shell输入输出重定向输入输出重定向 重定向符表示将标准输入从键盘重新定义到另外的流。重定向符表示将标准输入从键盘重新定义到另外的流。例如:例如:prog infile,prog infile,即即progprog命令将从文件命令将从文件infileinfile中读取中读取参数。参数。执行一个执行一个shellshell程序也可以使用这种方式。例如程序也可以使用这种方式。例如sh user1.sh sh user1.sh 就表示要执行就表示要执行user1.shuser1.sh这个这个shellshell程序。程序。重定向符重定向符,也能够混合使用,例如:也能够混合使用,例如:prog outfile prog outfile 表示表示progprog命令从命令从infileinfile中获取中获取命令参数,然后将执行结果输出到文件命令参数,然后将执行结果输出到文件outfileoutfile中。中。UNIXshell及其shell编程8.3 8.3 错误流重定向错误流重定向 在在UNIXUNIX系系统统中中,错错误误信信息息流流是是指指在在命命令令或或程程序序执执行行中中出出现现错错误误时时系系统统给给出出的的提提示示或或警警告告信信息息,UNIXUNIX中中将将它它们们作作为为一一个个独独立立的的标标准准输输出出流流进进行行定定义义,错错误误信信息息流流通通常常定定义义为为显显示示器器。当当然然,用用户户也也可可以以根根据据需需要要对对它它进进行行重重定定向向。不不同同的的shellshell在在这这方方面面有有所所不不同。同。CshellCshell中使用的错误流重定向符是:中使用的错误流重定向符是:&,&,例如:例如:cc abc.c&log.txt,cc abc.c&log.txt,即将编译过程中的输出流和即将编译过程中的输出流和错误流定向为错误流定向为log.txtlog.txt文件。文件。在在BshellBshell中则不用,需要如下书写:中则不用,需要如下书写:cc abc.c 2log.txt cc abc.c 2log.txtUNIXshell及其shell编程过滤命令过滤命令按列或域截取命令按列或域截取命令 cut格式格式:cut option file参数:参数:c,-f,-drootredhat#cat/etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin.sunying:x:501:/home/sunying:/bin/bashrootredhat#cut c1-8/etc/passwdoption file截取文件截取文件/etc/passwd的的每一行的第每一行的第1到第到第8个字符,个字符,并显示并显示 root:x:0 bin:x:1:daemon:x.sunying:rootredhatUNIXshell及其shell编程过滤命令过滤命令按列或域截取命令按列或域截取命令 cutrootredhat#cat/etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin.sunying:x:501:501:/bin/bashrootredhat#cut d:-f 1,3-4/etc/passwd截取文件截取文件/etc/passwd的每一的每一行的第行的第1,3,4域(单词),域(单词),分隔符为分隔符为:root:0:0 bin:1:1 daemon:2:2.sunying:501:501rootredhatUNIXshell及其shell编程过滤命令过滤命令其它其它补充补充命令命令:grep option 模式模式 文件名文件名功能功能:按指定选项在指定文件(组)中搜索特定的内容。按指定选项在指定文件(组)中搜索特定的内容。参数说明参数说明:-c打印匹配的行数打印匹配的行数-i模式不区分大小写模式不区分大小写-l只显示含指定模式的文件名只显示含指定模式的文件名-L只显示不含指定模式的文件名只显示不含指定模式的文件名-n同时显示行号同时显示行号例:在例:在file.txt文件中查找文件中查找abc字符串并显示行号字符串并显示行号grep-n abc file.txt字计数(字计数(行行l l、字、字w w、字符、字符c c):wc:wc-lwc file翻译字符翻译字符(-s紧凑):紧凑):tr s file还有还有sort排序排序,more分屏输出命令分屏输出命令UNIXshell及其shell编程8.4 8.4 管道线处理管道线处理 管管道道线线可可以以实实现现将将一一个个程程序序或或命命令令的的输输出出作作为为另另外外一一个个程程序序或或命命令令的的输输入入,管管道道线线作作为为两两个个命命令令之之间间的的分分隔隔符。管道线的符号是符。管道线的符号是“|”“|”。例如有这样一组命令:例如有这样一组命令:$ls l tempfile ls l tempfile$wc l tempfile wc l tempfile$rm tempfile rm tempfile管道线处理:管道线处理:$ls-l|wc-l$ls-l|wc-lUNIXshell及其shell编程8.4 8.4 管道线处理管道线处理 除除此此之之外外,还还有有“;”、“&”“&”、“&”“&”、“|”“|”可可替替代代管管道线道线“|”“|”作为命令列表的分隔符作为命令列表的分隔符.其中:其中:“;”“;”:表示多个命令顺序执行:表示多个命令顺序执行“&”“&”:置于命令行尾,表示将命令的执行过程放到后台处理。:置于命令行尾,表示将命令的执行过程放到后台处理。“&”“&”:代代替替原原有有的的符符号号“|”“|”,表表示示当当左左边边的的命命令令为为“真真”值值时,执行右边的命令。时,执行右边的命令。“|”“|”:代代替替原原有有的的符符号号“|”“|”,表表示示当当左左边边的的命命令令为为“假假”值值时,执行右边的命令。时,执行右边的命令。UNIXshell及其shell编程8.4 8.4 管道线处理管道线处理 例如:例如:(a a)pwd pwd;who who;ls l ls l(b b)cc prgm.c cc prgm.c&(c c)write zhang letter write zhang letter|mail zhang letter mail zhang letter(d d)mail zhang letter mail zhang PS2=UNIXshell及其shell编程用户工作环境设置用户工作环境设置LOGNAME=testLOGNAME=test_=clear_=clearCOLORS=/etc/DIR_COLORSCOLORS=/etc/DIR_COLORSTERM=ansiTERM=ansiPPID=3296PPID=3296PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/binPATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/binREMOTEHOST=202.103.65.22REMOTEHOST=202.103.65.22LANG=en_US.UTF-8LANG=en_US.UTF-8HISTSIZE=1000HISTSIZE=1000SHELL=/bin/bshSHELL=/bin/bshPWD=/home/test/tPWD=/home/test/t其他的其他的shellshell如如CshellCshell,KshellKshell均是大同小异均是大同小异 UNIXshell及其shell编程用户工作环境设置用户工作环境设置3.3.shellshell变量类型变量类型:环境变量和用户变量(自定义变量):环境变量和用户变量(自定义变量)4.4.显示和清除变量的命令:显示和清除变量的命令:setset和和unsetunset4.4.标准变量的解释标准变量的解释:HOMEHOME户主目录的完整路径。户主目录的完整路径。IFSIFS内部字段分隔符。如内部字段分隔符。如ls ls ll中间的空格的约定。中间的空格的约定。MAILMAIL指定接受邮件的文件名。指定接受邮件的文件名。MAILCHECKMAILCHECK设置巡检邮箱的周期。设置巡检邮箱的周期。PATHPATH设置设置shellshell定位命令要搜寻的目录。路经前缀:号。定位命令要搜寻的目录。路经前缀:号。PS1PS1命令提示符命令提示符1 1。PS2PS2命令提示符命令提示符2 2。命令输入中提示符。命令输入中提示符CDPATHCDPATH设置绝对路径。设置绝对路径。SHELLSHELL 设置用户登录设置用户登录shellshell的完整路径。的完整路径。TERMTERM设置用户终端类型。设置用户终端类型。TZTZ设置用户所在时区。设置用户所在时区。UNIXshell及其shell编程第四章 vi编辑器的使用4.1 vi编辑器Vi编辑器是全屏幕文本编辑器。有两个版本:有两个版本:1)view编辑器只读2)vedit编辑器2.Vi的工作方式:的工作方式:1)命令模式:初始模式,键入命令可实现删除行、查找字、移光标等操作。2)文本输入方式:按键解释为光标示意下的文本输入。3)*状态行UNIXshell及其shell编程4.2 基本的vi编辑器命令1.进入vi编辑器初始为命令模式1)启动vi命令格式:vi-Rc2)选项:-R只读、-c/2)输入文本要进入文本输入模式:可用i键。键返回。3)命令模式下.存盘退出vi用:wq.不存盘退出vi用:q!(强制执行).另存为:w .编辑多文件下一个:n.读入文件追加:r UNIXshell及其shell编程4.2 基本的vi编辑器命令2.由命令模式转入文本输入模式的控键命令i在光标左侧输入正文I在光标所在行首输入正文a在光标右侧输入正文A在光标所在行尾输入正文o在光标所在行的下一行增添新行O在光标所在行的上一行增添新行R替换从光标位置开始的字符UNIXshell及其shell编程4.2 基本的vi编辑器命令3.命令模式下移动光标键的控键命令左移(h)、下移(j)、上移(k)、右移(l)$光标移到当前行尾。w光标向右移动一个字。b光标向左移动一个字。e光标移动到字尾。0(零)光标移动到当前行首。光标移动到下一行首。光标向右移动一格。光标向左移动一格。UNIXshell及其shell编程4.2 基本的vi编辑器命令4.命令模式下文本修改的控键命令(通常不换模式)5.x删除光标位置指定字符6.dd删除光标所在行7.u撤销最新的修改8.U撤销对当前行所做的修改9.r替换光标位置上的字符R替换从光标位置开始的字符*转换模式.(点)重复上一次的修改UNIXshell及其shell编程4.2 基本的vi编辑器命令5.命令模式下输入命令实现的操作(要有符号前缀):1)向前搜索字符串命令:/2)向后搜索字符串命令:?3)注意操作要点:首次给定目标串值,多次无参搜索。4)另外还有:wq、:q!及:5):w保存文件但不退出vi编辑器6):q退出vi编辑器,前提无修改7)ZZ保存文件,退出vi编辑器8):help在线帮助UNIXshell及其shell编程第第1212章章 Shell Shell程序设计程序设计使使用用shell程程序序设设计计,可可以以完完成成比比较较复复杂杂并并且且自自动动执执行行的的任任务务。shell程程序序在在本本质质上上是是一一种种解解释释执执行行的的脚脚本本语语言言,使使用用的的元元素素是是UNIX系系统统的的命命令令集集,与与windows系系统统bat批批处处理理文文件件原原理理相相同同,但是更强大,也更灵活。但是更强大,也更灵活。本节内容我们将使用本节内容我们将使用B-shell进行进行shell程序设计。程序设计。1 Shell 1 Shell程序的执行方式程序的执行方式 2 Shell 2 Shell程序的变量使用程序的变量使用 3 test 3 test命令的使用命令的使用 4 4 条件控制语句条件控制语句 5 Shell 5 Shell程序调试程序调试UNIXshell及其shell编程12.1 Shell12.1 Shell程序的执行方式程序的执行方式建立一个比较简单的建立一个比较简单的shell程序脚本文件程序脚本文件test.sh,内容如下:,内容如下:datewhops执行这个执行这个test.sh可以有多种方式。可以有多种方式。ps命令显示进程状态。命令显示进程状态。1)将)将test.sh作为作为shell命令的执行参数来完成该命令的执行参数来完成该shell的执行:的执行:$shtest.sh2)利用输入输出的重定向方式)利用输入输出的重定向方式$shtest.sh3)直直接接执执行行该该shell程程序序,但但首首先先要要保保证证该该shell程程序序具具备备可可执执行行的的权权限限,可可以以用用chmod来来修修改改:chmoda+xtest.sh,之之后后在命令行执行它在命令行执行它$test.shUNIXshell及其shell编程12.2 Shell12.2 Shell程序的变量使用程序的变量使用 如如果果shell程程序序只只能能简简单单地地执执行行一一些些命命令令,那那shell的的功功能能无无疑疑是是非非常常弱弱的的,幸幸运运的的是是,shell程程序序被被设设计计为为可可以以支支持持变变量量的的使使用用,比比如如定定义义变变量量,应应用用变变量量的的值值等等等等。这这使使得得shell程程序序具具有有异异常常强强大大的的功功能能。需需要要注注意意的的是是,shell的的变变量量只只有有字字符符串串型型,在在shell程程序序中中出出现现的的数数值值计计算算都都是是基基于于字符串类型来完成的。字符串类型来完成的。1)shell中的变量和变量赋值中的变量和变量赋值shell变变量量定定义义由由字字母母开开始始,可可以以包包含含数数字字,字字母母和和下下划划线线,例例如如var1,username,pass_word等等。变变量量的的赋赋值值可可以以在在程程序序运运行行中中进进行行,也也可可以以在在变变量量定定义义时时进进行行,例例如如UNIX=“SYSTEMV”,如如果果字字符符串串中中间间没没有有空空格格和和制制表表符符,则可以不要双引号。则可以不要双引号。值得注意的是值得注意的是B-shell中等号的两边是不允许有空格的。中等号的两边是不允许有空格的。UNIXshell及其shell编程12.2 Shell12.2 Shell程序的变量使用程序的变量使用2)shell中变量的访问和参数替换中变量的访问和参数替换在在shell程程序序中中,或或者者是是shell命命令令中中,使使用用操操作作符符$来来对对shell变量进行访问。例如,要显示某个变量时,可以输入:变量进行访问。例如,要显示某个变量时,可以输入:$echo$UNIX(系统将会显示(系统将会显示SYSTEMV)在在某某些些场场合合下下,为为了了明明确确表表示示对对shell变变量量的的引引用用,可可以以用用花花括弧括弧或者双引号将变量名或变量引用括起来,例如:或者双引号将变量名或变量引用括起来,例如:$echo$UNIX$echo$UNIXAaaaaa$echo“$UNIX”isverygoodSYSTEMVSYSTEMVAaaaaaSYSTEMVisverygoodUNIXshell及其shell编程(a)单单引引号号:使使用用单单引引号号时时,shell将将一一对对单单引引号号之之间间的的内内容容看看成是纯粹的字符串信息,一对单引号之间可以包含更多的单引号。成是纯粹的字符串信息,一对单引号之间可以包含更多的单引号。$you”kkk”$echothisisjustatest,can$youtellmethetime?将将会会显显示示thisisjustatest,can$youtellmethetime?,它它不不会会将将$you替换成替换成“kkk“,同时同时test也是作为字符串内容来处理的。也是作为字符串内容来处理的。(b)双双引引号号“:它它将将双双引引号号之之间间的的特特殊殊字字符符作作为为shell中中的的含含义义来解释执行。来解释执行。可认为是替代单引号可认为是替代单引号的特殊扩展用法。的特殊扩展用法。$file=unixshell$echo“thecontentofdateisin$file”这这个个例例子子将将会会显显示示 the content of wed Aug 16 16:20:12 is inunixshell,这这个个例例子子中中,特特殊殊部部分分有有反反引引号号引引入入命命令令date被被解解释释成了当前时间的返回值,及成了当前时间的返回值,及$file被解释成了被解释成了unixshell字符串。字符串。3)shell中中引引号号的的说说明明:单单引引号号、双双引引号号“”、反反引引号号UNIXshell及其shell编程4)变量的定义域)变量的定义域同同其其他他的的编编程程语语言言如如C,pascal一一样样,shell的的变变量量也也有有局局部部变变量量和和全全局局变变量量的的区区别别。通通常常在在一一个个shell程程序序中中,通通过过形形如如var1=abc方方式式定定义义的的都都是是局局部部变变量量,只只能能在在该该shell程程序序的的进进程程中中起起作作用用,要要定定义义全全局局变变量量,需需要要在在局局部部变变量量定定义义之之后后使使用用export命命令令来来将将这这个变量声明为全局的个变量声明为全局的:export$var13)shell中引号的说明中引号的说明:单引号单引号、双引号双引号“”、反引号反引号(c)反引号)反引号 用它来赋值时,表示变量中保存的是执行对应命用它来赋值时,表示变量中保存的是执行对应命令的结果。令的结果。$name=whoami$echo$name这个时候显示的不是字符串这个时候显示的不是字符串whoami,而是执行字符串,而是执行字符串whoami的返回结果,当然,要先保证字符串是一个合法的命令。的返回结果,当然,要先保证字符串是一个合法的命令。UNIXshell及其shell编程以以下下面面的的例例子子var.sh,我我们们来来说说明明全全局局变变量量和和局局部部变变量量的的区区别别和和使用使用$var1=csu$echo$var1$sh$echo$var1$exit$echo$var1$export$var1$sh$echo$var1第第一一个个echo显显示示的的是是csu,这是通常的用法,这是通常的用法第第三三行行,调调用用sh进进入入一个新的一个新的shell进程进程第第四四行行的的echo显显示示为为空空,因因为为var在在这这个个进进程程中中并并没没有有进进行行定定义义第第五五行行,调调用用exit退退出出新新建建的的shell回回到到原原来来shell的进程中的进程中第第六六行行的的echo又又能能够够正常显示了正常显示了第第七七行行调调用用export,将将var1定定义义为为全全局局的的,这这样样在在新新建建的的shell中中,var1也也能访问,能访问,最后一行显示出最后一行显示出csuUNIXshell及其shell编程12.2 Shell12.2 Shell程序的变量使用程序的变量使用5)Shell预定义变量和环境变量预定义变量和环境变量UNIX系系统统中中,在在shell中中除除了了用用户户可可以以定定义义变变量量外外,还还存存在在一一些些系系统统变变量量,称称为为预预定定义义变变量量和和环环境境变变量量。实实际际中中预预定定义义变变量量和和环环境境变变量量没没有有明明显显的的界界定定,都都是是UNIX为为了了使使系系统统能能正正确确运运行行,预预先先设设定定的的一一些些默默认认的的系系统统变变量量。在在Bshell中中,用用set对对这这些些变变量量进进行行赋赋值值,而而在在csh中中,用用setenv这这个个命命令令。通通常常这这些些系系统统变变量量是是在在环环境境设设置置文文件件如如.profile,.cshrc,.login等文件中进行说明和完成赋值的。等文件中进行说明和完成赋值的。UNIXshell及其shell编程12.2 Shell12.2 Shell程序的变量使用程序的变量使用 在在shell编编程程中中可可以以使使用用位位置置变变量量,类类似似C程程序序中中的的argc和和argv参数的功能,用于对命令行中各个参数位置的描述。参数的功能,用于对命令行中各个参数位置的描述。#listargs.shlistargs.sh argv1 argv2 argv3 argv4$0$1$2$3$46)Shell中命令的位置变量中命令的位置变量Bshell变量变量CShell变量变量变量的作用变量的作用$#$#argv位置参数的个数位置参数的个数$*表示参数列表表示参数列表$?$status前一个命令返回的状态值前一个命令返回的状态值$当前当前shell进程的进程的pid值值$!最近访问的后台进程最近访问的后台进程pid值值几个常用的特殊变量:几个常用的特殊变量:UNIXshell及其shell编程12.2 Shell12.2 Shell程序的变量使用程序的变量使用7)Shell中的变量替换中的变量替换在在shell编编程程中中,有有时时候候会会遇遇到到这这种种情情况况,一一个个变变量量在在尚尚未未赋赋值值的的时时候候,就就被被程程序序进进行行了了输输出出处处理理,这这样样输输出出的的变变量量将将会会得得到到一一个个空空字字符符串串的的结结果果。为为了了避避免免这这种种情情况况的的发发生生,shell中中引引入入了了变变量量替替换换的的概概念念,在在变变量没有赋值的时候可以用一个预先定义的量没有赋值的时候可以用一个预先定义的字符串字符串来替换。来替换。替换的形式有三种,列举如下:替换的形式有三种,列举如下:$var:-word表表示示如如果果var已已经经被被赋赋值值,则则取取它它的的值值,否否则取则取word的值,但的值,但var不改变。不改变。$var:=word表表示示如如果果var已已经经被被赋赋值值,则则取取它它的的值值,否否则取则取word的值,同时将的值,同时将word赋给赋给var。$var:+word表表示示如如果果var已已经经被被赋赋值值,则则取取它它的的值值,否否则则var变量置为空。变量置为空。8)用命令做变量替换)用命令做变量替换 这个方式和用反引号相同!这个方式和用反引号相同!UNIXshell及其shell编程12.3 test12.3 test命令的使用命令的使用在在shell中中经经常常要要对对某某些些变变量量的的值值进进行行判判断断来来决决定定分分支支程程序序的的走走向向,如如同同C中中使使用用if(a=0)一一样样。Shell中中通通过过test命令来完成这个功能。命令来完成这个功能。test的格式表示为:的格式表示为:testexpre或者或者testexpretest命命令令的的执执行行结结果果是是,如如果果表表达达式式为为真真,则则返返回回真真值值0,否则返回非,否则返回非0的假值。的假值。test命命令令可可以以对对文文件件,字字符符串串内内容容,整整数数n等等变变量量进行测试。进行测试。UNIXshell及其shell编程12.3 test12.3 test命令的使用命令的使用1)对文件特性的测试)对文件特性的测试语法:语法:test-dfrwxsfile-dfile:文件文件file存在并且为目录文件存在并且为目录文件-ffile:文件:文件file存在并且为普通文件存在并且为普通文件-rfile:文件文件file存在并且为可读文件存在并且为可读文件-wfile:文件文件file存在并且为可写文件存在并且为可写文件-xfile:文件文件file存在并且为可执行文件存在并且为可执行文件-sfile:文件文件file存在并且文件长度为非存在并且文件长度为非0例如:例如:$testd/home/user&echo“directoryexists”判断判断/home/user是否为一个目录文件,如果为真(是否为一个目录文件,如果为真(&)则执行)则执行echo进行显示进行显示$testx/home/user/sh1.sh|echo“sh1.shdosnotexistorisnotrunnable!”判断文件判断文件/home/user/sh1.sh是否可执行,如果为假(是否可执行,如果为假(|)则执行)则执行echo进行显示进行显示UNIXshell及其shell编程12.3 test12.3 test命令的使用命令的使用2)对字符串内容的测试)对字符串内容的测试语法语法:tests(字符串(字符串s为有值时返回真,为空则返回假)为有值时返回真,为空则返回假)testzs与与tests相反,为空时返回真,不空则返回假相反,为空时返回真,不空则返回假tests1=s2当字符串当字符串s1和和s2相等时返回真,不相当则返回假相等时返回真,不相当则返回假tests1!=s2与与tests1=s2相反。相反。注意注意=、!=!=两边有空格。两边有空格。例例 x1=“005”;x2=5 ,进行字符串测试,进行字符串测试$test“$x1”=“$x2”$echo$?系系统统将将显显示示1,1,结结果果为为假假值,表示值,表示x1x1和和x2x2不相等不相等UNIXshell及其shell编程12.3 test12.3 test命令的使用命令的使用3)对于整数)对于整数n的的测试的的测试格式格式testn1-eq/ne/lt/le/gt/gen2它们分别表示它们分别表示n1和和n2之间之间相等相等/不相等不相等/n1n2 /n1n2 /n1=n2时时返回真值。返回真值。例例 定义两个变量定义两个变量x1=“005”x2=5 ,进行数字式测试,进行数字式测试$test“$x1”-eq“$x2”$echo$?系系统统将将显显示示0,0,结结果果为为真真值值,表表示示数数字字x1x1和和数数字字x2x2相等相等UNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句在在结结构构化化程程序序设设计计中中,三三种种基基本本流流程程结结构构是是顺顺序序结结构构,分分支支结结构构,循环结构。其中的分支结构,在循环结构。其中的分支结构,在shell中常用中常用if和和case语句来实现。语句来实现。1)if语句语句if语语句句的的分分支支可可以以有有无无分分支支条条件件语语句句,二二分分支支条条件件语语句句,多多分分支支条件语句。条件语句。无分支条件语句格式无分支条件语句格式如下:如下:if条件条件then命令组命令组fi当当条条件件condition为为真真时时,执执行行then后后面面的的所所有有命命令令,condition为为假则执行假则执行fi后面的语句。后面的语句。UNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句1)if语句语句例:例:edit.sh注意注意test中中=两边有空格两边有空格iftest$#=1thencp$1$HOME/user1fivi$1exit0UNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句二分支条件语句:二分支条件语句:格式为格式为ifthenelse结构结构if条件条件then命令组命令组else.命令组命令组fi多分支结构:多分支结构:分支大于分支大于2的条件语句。的条件语句。if条件条件1then命令组命令组1elif条件条件2then命令组命令组2else命令组命令组n+1fiUNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句例例:假假设设一一个个连连续续运运行行系系统统,将将建建立立错错误误记记录录文文件件errorfile并并不不断断写写入入错错误误信信息息。现现在在要要求求编编写写一一个个shell程程序序来来产产生生定定时时错错误误日志文件日志文件datelog,能在能在datelog中体现每个时间段中的错误信息中体现每个时间段中的错误信息#checkerr.sh#checkerr.sh To To check check error error information information with with time time stamp stamp!date datelogdate datelogif test r errorfileif test r errorfile then thencat errorfile datelogcat errorfile datelogrm errorfilerm errorfileelseelse echo No error occurs during this hour!datelog echo No error occurs during this hour!datelogfificat datelogcat datelogUNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句2)case语句语句可以实现多选一的控制结构可以实现多选一的控制结构case语句的语法为:语句的语法为:casewordin模式模式1)命令命令;模式模式2)命令命令;模式模式3)命令命令;esac注注意意,在在case中中,每每个个命命名名命命令令的的结结束束用用;表表示示模模式式匹匹配配已已经完成,不再匹配其他的模式,相当于经完成,不再匹配其他的模式,相当于C中的中的break。UNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句例例:编编写写一一段段shell程程序序,根根据据执执行行时时获获取取的的当当前前时时间间显显示示不不同同的的问问候候信信息息。cc1-cn为为两两个个字字符符的的串串,第第二二字字符符取取自自列列中中之之一一。*表示任意字符序列。表示任意字符序列。#hello.sh#hello.shhour=date+%Hhour=date+%Hcase$hour incase$hour in 01-9|101)echo Good morining!;01-9|101)echo Good morining!;1234567)echo Good afternoon!;1234567)echo Good afternoon!;*)echo Good evening!;*)echo Good evening!;esacesacUNIXshell及其shell编程12.4 12.4 条件控制语句条件控制语句例例:利利用用shell的的位位置置变变量量参参数数编编写写一一个个shell,当当只只有有一一个个参参数数时时,从从键键盘盘输输入入文文本本保保存存到到data.txt中中,当当有有两两个个参参数数时时,将将参参数数1代代表表的的文文件件内内容容添添加加到到参参数数2表表示示的的文文件件,其其他他情情况况则则给给出出错误提示信息错误提示信息#append.sh#append.shcase$#incase$#in 1)cat data.txt;1)cat data.txt;2)cat$1$2;2)cat$1$2;*)echo Incorrect usage!;*)echo Incorrect usage!;esacesacUNIXshell及其shell编程12.5 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次。次。UNIXshell及其shell编程12.5 12.5 循环语句循环语句在需要的时候,也可以进行在需要的时候,也可以进行for循环的嵌套。循环的嵌套。见下面的例子:见下面的例子:cd$HOMEfordirinccworkdoecho“.In$dir.”cd$dirfor*.cdolsl$filedonecddoneUNIXshell及其shell编程12.5 12.5 循环语句循环语句2)while循环循环whiledodone结构结构while循循环环结结构构,每每次次先先判判断断循循环环条条件件,为为真真则则执执行行一一次次循循环环体体(重重复复执执行行部部分分),轮轮到到下下次次。否否则则结结束束循循环环(整体结构)。(整体结构)。格式:格式:whileconditiondo命令组命令组doneUNIXshell及其shell编程12.5 12.5 循环语句循环语句3)until循环循环untildodoneuntil循循环环和和while循循环环类类似似,所所不不同同的的是是until循循环环是是循循环环终终止止条条件。为假,才做(重复执行部分)循环体的执行。件。为假,才做(重复执行部分)循环体的执行。格式:格式:untilconditiondo命令组命令组done如如果果第第一一次次执执行行时时,循循环环条条件件condition就就为为真真,那那循循环环体体将将得得不不到到执执行行。同同时时还还要要注注意意,必必须须在在程程序序中中设设置置条条件件condition为为真的因素,否则循环将一直进行下去,从而进入了死循环。真的因素,否则循环将一直进行下去,从而进入了死循环。UNIXshell及其shell编程12.5 12.5 循环语句循环语句例例:编编写写shell程程序序一一次次性性创创建建若若干干个个新新文文件件,如如file1,file2,file3.file10。需要了解。需要了解两个相关命令两个相关命令1)1)touch touch 命令命令,改变文件的访问和修改时间,改变文件的访问和修改时间格式:格式:touch optiontime touch optiontime optionoption -a -a 只修改文件的访问时间只修改文件的访问时间 -m -m 只修改文件的修改时间只修改文件的修改时间当当指指定定文文件件不不存存在在,则则创创建建一一个个具具有有默默认认权权限限和和当当前前时时间间的的新新文件,文件,timetime格式格式MMDDHHMMMMDDHHMM2)2)exprexpr 命命令令,对对shellshell变变量量进进行行算算术术运运算算的的操操作作,因因为为shellshell变变量量的的值值都都是是字字符符型型,进进行行算算术术运运算算必必须须使使用用exprexpr命命令令,其带有三个参数其带有三个参数运算符两边要有空格运算符两边要有空格。涉及算术运算涉及算术运算+、-、*、/和和%运算。运算。UNIXshell及其shell编程12.5 12.5 循环语句循环语句shellshell中错误的算术运算:中错误的算术运算:#count=9#count=$count+11#echo count系统将显示:系统将显示:9+119+11shellshell中正确的算术运算:中正确的算术运算:#count=9#count=expr$count+11expr$count+11#echo count系统将显示:系统将显示:2020#genfiles.sh编程实现编程实现NUMBER=1While test$NUMBER lt 11do touch NUMBER=expr$NUMBER+1done UNIXshell及其shell编程12.6 Shell12.6 Shell程序调试程序调试shell程程序序是是一一种种解解释释性性语语言言,它它的的执执行行是是逐逐行行进进行行的的,程程序序中中是是否否有有语语法法错错误误,不不执执行行到到那那一一行行系系统统是是无无法法知知道道的的。C,pascal等等高高级级语语言言是是有有编编译译过过程程的的,程程序序中中的的语语法法错错误误在在编译阶段就能检测出来,因此比编译阶段就能检测出来,因此比shell更容易调试更容易调试shell程序通常有三种调试方法:程序通常有三种调试方法:1)交互式调试)交互式调试shell程程序序中中使使用用的的命命令令都都能能在在命命令令行行中中运运行行,所所以以对对于于一一些些不不很很熟熟悉悉的的命命令令和和语语法法可可以以先先用用命命令令进进行行验验证证,然然后后再再编编写写到到shell程程序序中中,这这种种调调试试方方法法称称为为交交互互式式调调试试,也也是是最最简简单单的一种调试方法。的一种调试方法。UNIXshell及其shell编程12.6 Shell12.6 Shell程序调试程序调试2)在在编编辑辑过过程程中中不不断断调调试试执执行行所所编编辑辑的的shell程程序序在在UNIX系系统统中中可可以以打打开开多多个个工工作作窗窗口口。我我们们可可以以在在一一个个窗窗口口中中用用vi等等编编辑辑器器进进行行编编辑辑,然然后后在在另另一一个个连连接接窗窗口口中中执执行行该该shell程程序序,这这样样可可以以随随时时观观察到已经编写的部分是否正确。最终完成这个察到已经编写的部分是否正确。最终完成这个shell程序的编写。程序的编写。3)用用shell程程序序提提供供的的跟跟踪踪功功能能进进行行调调试试shell程程序序可可以以使使用用-v-x选项对选项对shell程序进行跟踪程序进行跟踪-v:当当读读入入shell输输入入行行时时把把它它们们显显示示出出来来,完完成成详详细细跟跟踪踪。Shell程程序序在在完完成成这这段段程程序序执执行行时时首首先先逐逐行行读读入入执执行行的的命命令令,并并在在标标准准输输出出上上显显示示该该命命令令要要执执行行的的实实际际内内容容,然然后后执执行行该该命命令令。如如果果没没有有语语法法错误,执行将一直进行下去直到完成错误,执行将一直进行下去直到完成shell的执行。的执行。-x:执行命令前先把命令和它们的参数显示出来:执行命令前先把命令和它们的参数显示出来UNIXshell及其shell编程12.6 Shell12.6 Shell程序调试程序调试假设有这么一个简单的假设有这么一个简单的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,被直接替换成了参数的值。,被直接替换成了参数的值。UNIXshell及其shell编程12.6 Shell12.6 Shell程序调试程序调试在在调调试试一一个个比比较较大大的的shell时时,没没有有必必要要对对整整个个shell程程序序都都进进行行跟跟踪踪,可可以以只只对对其其中中较较为为集集中中关关注注的的部部分分进进行跟踪,这时可以通过行跟踪,这时可以通过setvset+v或或者者setxset+x来来把把需需要跟踪的部分包含进来。要跟踪的部分包含进来。1.使使用用forfor循循环环语语句句编编写写BshellBshell程程序序,完完成成显显示示用用户户注注册册目目录录下下a_sub,a_sub,b_subb_sub子子目目录录下下的的所所有有C C程序源文件和目标文件的列表程序源文件和目标文件的列表 UNIXshell及其shell编程12.7 Shell12.7 Shell编程示例编程示例#showCfile.sh#showCfile.sh if test-d if test-d$HOME/a_sub$HOME/a_sub then then echo-the.c and.obj files in$HOME/a_sub:echo-the.c and.obj files in$HOME/a_sub:-for in for in ls$HOME/a_subls$HOME/a_sub do do case$in case$in *.c)echo$;*.c)echo$;*.obj)echo$;*.obj)echo$;esac esac done done else else echo$HOME/a_sub does not exist!echo$HOME/a_sub does not exist!fi fi UNIXshell及其shell编程12.7 Shell12.7 Shell编程示例编程示例 if test-d if test-d$HOME/b_sub$HOME/b_sub then then echo-the.c and.obj files in$HOME/b_sub:-echo-the.c and.obj files in$HOME/b_sub:-for in for in ls$HOME/b_subls$HOME/b_sub do do case$in case$in *.c)echo“$is a C source file!”;*.c)echo“$is a C source file!”;*.obj)echo“$is an Object file!”;*.obj)echo“$is an Object file!”;esac esac done done else else echo$HOME/b_sub does not exist!echo$HOME/b_sub does not exist!fi fiUNIXshell及其shell编程12.7 Shell12.7 Shell编程示例编程示例2.连续输入若干个名字到文件连续输入若干个名字到文件中保留中保留read read 当当BshBsh遇遇到到一一个个readread语语句句时时,在在标标准准输输入入文文件件中中读读取取数数据据直直到到一一个个换换行行符符。此此时时ShellShell在在解解释释输输入入行行时时,不不进进行行文文件件名名或或变变量量的的替替换换,只只是是简简单单地地删删除除多多余余的的空空格格。然然后后ShellShell将将输输入入行行的的第第一一个个字字的的内内容容给给变变量量1,1,第第二二个个给给变变量量2,2,直直到到所所有有变变量量都都赋赋上上值值或或是是输输入入行行为为空空。若若输输入入行行中中字字的的个个数数超超过过变变量量个个数数,ShellShell将将把把输输入入行行中中剩剩余余的的所所有有字字的的内内容容都都赋赋给给最最后后一一个个变变量量。当当变变量量个个数数多多于于输输入入行行字字的的个个数数时时候候,多多于于的的变变量量将将赋赋一一个个空空值值。输输入入行行的的每每一一个个字字是是由由空空格格分分隔隔的的一一个个字字母母和和数数字字组组成成的的字字符符串串。可可以以通过重定向的方式从文件中读字符串。通过重定向的方式从文件中读字符串。UNIXshell及其shell编程 ans=yes ans=yes until test$ans=no until test$ans=no do do echo Enter a name echo Enter a name read name read name echo$name echo$name echo Continue?echo Continue?echo Enter yes or no echo Enter yes or no read ans read ans done done UNIXshell及其shell编程12.7 Shell12.7 Shell编程示例编程示例 while test-r abc.txt while test-r abc.txt do do echo file abc.txt has not been deleted!“echo file abc.txt
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!