《第五章程序设计优秀课件.ppt》由会员分享,可在线阅读,更多相关《第五章程序设计优秀课件.ppt(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章程序设计第1页,本讲稿共79页Linux内核概述内核概述shell层是内核之外的中间层,是用户和系统交互的界面。2第2页,本讲稿共79页Linux内核概述内核概述在前面章节,shell被解释为命令解释程序,即,它接收用户输入的命令,然后创建子进程,由子进程实现命令所规定的功能,等子进程终止工作后发出提示符。这是shell常见的使用方式。3第3页,本讲稿共79页Linux内核概述内核概述其实shell还是一种高级程序设计语言,它有变量、关键字还有各种控制语句4第4页,本讲稿共79页Linux shell程序设计Linux提供多种不同的提供多种不同的shell。常用。常用的有的有Bourne
2、 shell(简称简称sh)、C-shell(简称简称csh)、Korn shell(简称简称ksh)和和Bourne Again shell(简称简称bash)。5第5页,本讲稿共79页Linux shell程序设计Bourne shell是是AT&T Bell实验室实验室为为AT&T的的UNIX开发的,是开发的,是UNIX默默认的认的shell6第6页,本讲稿共79页Linux shell程序设计C-shell(简称简称csh)是加州伯克利大是加州伯克利大学的学的Bill Joy为为BSD UNIX开发的,开发的,与与sh不一样不一样7第7页,本讲稿共79页Linux shell程序设计K
3、orn shell(简称简称ksh)也是也是AT&T Bell实验室开发的,其命令交互界面实验室开发的,其命令交互界面和编程界面很好和编程界面很好8第8页,本讲稿共79页Linux shell程序设计Bourne Again shell(简称简称bash)是是GNU开发的一个开发的一个shell,是,是Linux默默认的认的shell9第9页,本讲稿共79页Linux shell程序设计shell特点:特点:对已有命令进行组合构成新命令,组合方式简单;对已有命令进行组合构成新命令,组合方式简单;提供了文件名扩展字符,提供了文件名扩展字符,使单一字符串可以匹配多个文件名使单一字符串可以匹配多个文
4、件名;可以直接使用可以直接使用shell的内置命令而不需创建新的进程;的内置命令而不需创建新的进程;shell灵活使用数据流,提供通配符、输入灵活使用数据流,提供通配符、输入/输出重定向、管道线等机制;输出重定向、管道线等机制;提供了顺序流程控制、条件控制、循环控制语句;提供了顺序流程控制、条件控制、循环控制语句;shell提供了在后台执行命令的能力;提供了在后台执行命令的能力;shell提供了可配置的环境,允许用户创建修改命令、命令提示符等系统行为;提供了可配置的环境,允许用户创建修改命令、命令提示符等系统行为;shell提供了一个高级的命令语言,允许用户创建简单和复杂的程序。提供了一个高级
5、的命令语言,允许用户创建简单和复杂的程序。操作系统本身自带的命令。不需要外部软件支持的命操作系统本身自带的命令。不需要外部软件支持的命令,令,如:如:cd、echo、kill 等命令等命令10第10页,本讲稿共79页Linux shell程序设计shell脚本的创建和执行:脚本的创建和执行:使使用用shell的的最最简简单单的的方方法法是是从从键键盘盘上上直直接接输输入入命命令令行行或或存存入入文文件件中,这种被中,这种被shell解释执行的文件为解释执行的文件为shell脚本。脚本。利用编辑器建立一个利用编辑器建立一个shell脚本,和普通文件一样,脚本,和普通文件一样,例:例:$vi ex
6、1 建立一个名字为建立一个名字为ex1的的shell脚本脚本11第11页,本讲稿共79页Linux shell程序设计执行执行shell脚本的方式有三种:脚本的方式有三种:(1)$bash脚本名脚本名(2)$bash 脚本名脚本名 参数参数(3)将)将shell脚本的权限设置为可执行,然后再提示符下直接执行它脚本的权限设置为可执行,然后再提示符下直接执行它用输入重定向让用输入重定向让shell从给定文件中读入命令行,从给定文件中读入命令行,进行相应处理。进行相应处理。以脚本名作为参数传递给程序中的命令以脚本名作为参数传递给程序中的命令例(例(1)$bashex1 (2)$ex1 (3)$chm
7、od a+x ex2$./ex2()脚本后面不能带参数脚本后面不能带参数目前目前使用的使用的shell以以表示表示 把把shell脚本脚本ex2置为对所有用户都有执行权限置为对所有用户都有执行权限,然后然后在提示符后可以直接执行该文件在提示符后可以直接执行该文件12第12页,本讲稿共79页Linux shell程序设计bash提供了命令历史功能,即系统为每一个用户维护一个命令历史提供了命令历史功能,即系统为每一个用户维护一个命令历史文件文件(/root/.bash_history),该文件把用户输入的命令自动的加到该),该文件把用户输入的命令自动的加到该命令历史表中。用户可以调用或者修改以前的
8、命令。命令历史表中。用户可以调用或者修改以前的命令。$HISTFILE=”/home/.test_history”$HISTSIZE=100可以通过可以通过HISTFILE改变存改变存放历史命令的文件放历史命令的文件将历史命令存放在将历史命令存放在/home/.test_history下下设置设置历史文件中可以保历史文件中可以保留留100条历史命令,默认是条历史命令,默认是50013第13页,本讲稿共79页Linux shell程序设计 显示命令历史表中的命令显示命令历史表中的命令 historyoptionarg 显示历史命令,包括刚输显示历史命令,包括刚输入的入的history例:例:$h
9、istory$history 50显示历史表中的最后显示历史表中的最后50行行命令命令14第14页,本讲稿共79页Linux shell程序设计执执行行历历史史命命令令:以以字字符符“!”开开头头,后后随随一一个个或或多多个个字字符符来来定定义义某某种种类类型型的的历历史史命命令令。(符号间没有空格符号间没有空格)格式格式意意义义!重复上一条命令,相当于!重复上一条命令,相当于!-1!重新重新执执行第行第n条条历历史命令史命令!-n重新重新执执行倒数第行倒数第n条条历历史命令。!史命令。!-1等于!等于!string重新重新执执行以字符串行以字符串string开开头头的最近的的最近的历历史命令
10、行。史命令行。例:!例:!ca表示表示访问访问最近的最近的cat命令命令!?string?重新重新执执行最近的、包含行最近的、包含string的的历历史命令。史命令。例:!例:!?hist?表示重复前面含有表示重复前面含有hist的命令的命令15第15页,本讲稿共79页Linux shell程序设计名称补全:在名称补全:在bash命令行上输入目录名和文件名时,可以按命令行上输入目录名和文件名时,可以按tab键让系统自键让系统自动补全剩余的部分。动补全剩余的部分。例:例:$cd/us$cat e系统自动补全系统自动补全/usr如果目录中有如果目录中有ex1、ex2、exam1则系统会则系统会补全
11、到三者相同部分的最后一个字符,屏补全到三者相同部分的最后一个字符,屏幕显示为幕显示为$cat ex,如果此时用户继续按,如果此时用户继续按Tab键,屏幕显示为键,屏幕显示为$cat ex ex1 ex2 exam1 等待用户选择等待用户选择16第16页,本讲稿共79页Linux shell程序设计别名:对于常用的选项或参数比较多的固定命令可以取个别名替别名:对于常用的选项或参数比较多的固定命令可以取个别名替换,定义别名的命令换,定义别名的命令 aliasname=value 例:例:$alias$alias ll=ls-l$ll$alias ll=ls-l$ll在屏幕上显示别名清单在屏幕上显示
12、别名清单等价于等价于$ls-l等价于等价于$ls 17第17页,本讲稿共79页Linux shell程序设计别名:对于常用的选项或参数比较多的固定命令可以取个别别名:对于常用的选项或参数比较多的固定命令可以取个别名替换,定义别名的命令名替换,定义别名的命令 aliasname=value 取消别名:取消别名:unalias name执行后从别名表中删除执行后从别名表中删除name指定的别名指定的别名 18第18页,本讲稿共79页Linux shell程序设计19第19页,本讲稿共79页Linux shell程序设计模式表达式:除了模式表达式:除了*、?和和之外还有以下形式:之外还有以下形式:(
13、)(模式表):匹配给定模式表中的模式的次或多次出现,各模()(模式表):匹配给定模式表中的模式的次或多次出现,各模式以分开;式以分开;()(模式表):匹配给定模式表中的模式的次或多次出现,各模式以()(模式表):匹配给定模式表中的模式的次或多次出现,各模式以分开;分开;()?(模式表):匹配给定模式表中任一模式的次或次出现,各()?(模式表):匹配给定模式表中任一模式的次或次出现,各模式以分开;模式以分开;()()(模式表模式表):仅匹配模式表中的给定模式的次出现;:仅匹配模式表中的给定模式的次出现;()!(模式表):除给定模式表中的模式外匹配其他任何模式()!(模式表):除给定模式表中的模式
14、外匹配其他任何模式20第20页,本讲稿共79页Linux shell程序设计例:例:file*(.c|.o)将匹配文件将匹配文件file、file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等等file(.c|.o)将匹配文件将匹配文件file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等等,不匹配不匹配filefile?(.c|.o)只匹配文件只匹配文件file、file.c、file.o,不匹配,不匹配file.c.c、file.o.o、file.c.o、file.o.c等,等,file(.c|.o
15、)只匹配文件只匹配文件file.c、file.o不匹配不匹配file、file.c.c、file.o.o、file.c.o、file.o.c等等21第21页,本讲稿共79页Linux shell程序设计引号:分为单引号、双引号和倒引号。引号:分为单引号、双引号和倒引号。用用双双引引号号括括起起来来除除$、倒倒引引号号()和和反反斜斜线线()之之外外都都作作为为普普通通字字符符对对待待,$表表示示变变量量替替换换;倒倒引引号号()表表示示命命令令替替换换;反反斜线(斜线()表示转义字符。)表示转义字符。单引号括起来的字符表示都是普通字符。单引号括起来的字符表示都是普通字符。倒引号(倒引号()括起
16、来的字符被)括起来的字符被shell解释为命令行。解释为命令行。22第22页,本讲稿共79页Linux shell程序设计例:例:$cat ex3echo“current directory is pwd”echo”home directory is$HOME”echo“file*.?”$bash ex3current directory is/homehome directory is/rootfile*.?23第23页,本讲稿共79页Linux shell程序设计注释:注释:shell程序中以程序中以#开头的正文行表示注释;在开头的正文行表示注释;在shell脚本脚本的第一行以的第一行以#
17、!开头表示该脚本是用哪种!开头表示该脚本是用哪种shell编写的,从而调编写的,从而调用相应的解释程序执行。用相应的解释程序执行。后台命令:当程序执行需要时间过长时,那么在命令最后输入后台命令:当程序执行需要时间过长时,那么在命令最后输入&符号,则符号,则shell在后台启动该程序,马上显示下一个提示符,允在后台启动该程序,马上显示下一个提示符,允许用户输入新的命令。许用户输入新的命令。24第24页,本讲稿共79页Linux shell程序设计等价于等价于pwd这里分号隔开的命令,前面的命令执行成功这里分号隔开的命令,前面的命令执行成功 who|wc l 与否并不影响与否并不影响 后面命令的执
18、行后面命令的执行cd/home命令执行操作符:多条命令可以在一行中出现,各命令之间以分号隔开,命令执行操作符:多条命令可以在一行中出现,各命令之间以分号隔开,例例 pwd;who|wc-l;cd/home25第25页,本讲稿共79页Linux shell程序设计命令执行操作符:命令执行操作符:逻辑与操作符逻辑与操作符&可将两个命令联系在一起,可将两个命令联系在一起,命令命令&命令表示先执行命令,如果执行成功才执行命令,否则不命令表示先执行命令,如果执行成功才执行命令,否则不执行命令。执行命令。逻辑非操作符逻辑非操作符|可将两个命令联系在一起,可将两个命令联系在一起,命令命令|命令命令 表示先执
19、行命令,如果不成功则执行命令,如果命令表示先执行命令,如果不成功则执行命令,如果命令成功则不执行命令。成功则不执行命令。26第26页,本讲稿共79页Linux shell程序设计27第27页,本讲稿共79页Linux shell程序设计成组命令:在成组命令:在shell中有两种方式将若干命令组合在一起,一个是花括中有两种方式将若干命令组合在一起,一个是花括号,一个是圆括号;号,一个是圆括号;()();形式:以花括号括起来的全部命令作为一条命令执行,左括号形式:以花括号括起来的全部命令作为一条命令执行,左括号后有一个空格右括号前有分号后有一个空格右括号前有分号()()()形式:左括号后不需有空格
20、,右括号之前也不需加分号)形式:左括号后不需有空格,右括号之前也不需加分号例:例:$echo“user report for date”;who;|cat (echo和和who命令的执行结果经管道传给屏幕进行输出命令的执行结果经管道传给屏幕进行输出)28第28页,本讲稿共79页Linux shell程序设计二者区别:花括号括起来的组命令在本二者区别:花括号括起来的组命令在本shell执行命令,不产生新进程;执行命令,不产生新进程;圆括号括起来的组命令要在新的子圆括号括起来的组命令要在新的子shell内执行,要建立新的子进程。内执行,要建立新的子进程。29第29页,本讲稿共79页Linux sh
21、ell程序设计shell有两类变量:环境变量和临时变量。有两类变量:环境变量和临时变量。环境变量是永久性变量,值不会随环境变量是永久性变量,值不会随shell脚本执行结束而消失;脚本执行结束而消失;临临时时变变量量是是在在shell程程序序内内部部定定义义,使使用用范范围围仅仅限限于于定定义义它它的的程程序序,出出了了程程序序就就不不能能使使用用,程程序序结结束束后后,它它的的值值就就不不存存在在了。了。环境变量像$HOME(用户主目录的全路径)$LOGNAME(用户的注册名,通过该变量系统来确认用户是否是文件的拥有者,是否有权利执行某个命令)$PATH(shell从中查找命令的目录列表,例:
22、PATH=$PATH:/home)30第30页,本讲稿共79页Linux shell程序设计用户定义的变量:变量名是以字母或下划线开头,由字母、下划用户定义的变量:变量名是以字母或下划线开头,由字母、下划线和数字组成的序列。大小写意义不同,变量长度不受限制。线和数字组成的序列。大小写意义不同,变量长度不受限制。定义变量并赋值的一般形式定义变量并赋值的一般形式 变量名字符串变量名字符串引用变量时用引用变量时用“$变量变量”31第31页,本讲稿共79页Linux shell程序设计例:例:$dir=/home/ccc$echo$dir$echo dir$today=Sunday$echo$toda
23、y$Today$dir=/home/cc$cat$dirc/mi.c$cat$dirc/mi.c$cat$dir/mi.c显示结果/home/ccc显示结果dir显示结果Sunday Today未被赋值,为空串将文件/home/ccc/mi.c显示出来提示出错,认为dirc是个新变量,前面未赋值,所以找不到文件mi.c将文件/home/cc/mi.c显示出来32第32页,本讲稿共79页Linux shell程序设计数组:数组:bash只提供一维数组,数组元素下标由只提供一维数组,数组元素下标由0开始编号。开始编号。一般形式为:一般形式为:declarea数组名数组名读取数组元素值的一般形式是:
24、读取数组元素值的一般形式是:$数组名下标数组名下标对数组元素赋值的一般形式是:对数组元素赋值的一般形式是:数组名下标值或数组名(值值数组名下标值或数组名(值值值)值)33第33页,本讲稿共79页Linux shell程序设计例:例:$city0=Beijing$city1=Shanghai$echo$city0$A=(this is an example of shell script)$echo$A0$A2$A3$A6$echo$A8显示结果Beijing显示结果结果显示为this an example script显示结果结果显示为空串34第34页,本讲稿共79页Linux shell程序
25、设计输入命令输入命令read命令:命令:从键盘上读取数据,然后赋给指定的变量,从键盘上读取数据,然后赋给指定的变量,例例$read x y zToday is Monday$echo$z$x$y显示结果Monday Today is35第35页,本讲稿共79页Linux shell程序设计输入命令输入命令read命令:命令:从键盘上读取数据,然后赋给指定的变量,从键盘上读取数据,然后赋给指定的变量,例例$read n1 n2 n3First Second Third 1234 abcd(回车键回车键)$echo$n3$echo$n2$n1变量个数少于数据个数时,从左往右对应赋值,最后一个变量被
26、赋予剩余的所有数据显示结果为Third 1234 abcd显示结果为Second First36第36页,本讲稿共79页Linux shell程序设计输入命令输入命令read命令:命令:从键盘上读取数据,然后赋给指定的变量,从键盘上读取数据,然后赋给指定的变量,例例$read n1 n2 n3(回车键回车键)$echo$n3$echo$n2$n1变量个数多于给定的数据个数时,依次对应赋值,没有数据对应的取空串显示结果为空串显示结果为2 137第37页,本讲稿共79页Linux shell程序设计预先定义的特殊变量预先定义的特殊变量()()$#命令行上参数的个数命令行上参数的个数()()$?上一
27、条命令的返回值,执行成功为;执行失败返回非值上一条命令的返回值,执行成功为;执行失败返回非值()()$当前进程的进程号当前进程的进程号()()$!上一个后台命令对应的进程号,由位数字构成上一个后台命令对应的进程号,由位数字构成()()$-由当前由当前shell设置的执行标志名组成的字符串设置的执行标志名组成的字符串()()$*表示在命令行中实际给出的所有实参字符串表示在命令行中实际给出的所有实参字符串例例ex6 m1.c m2.c($#值为)值为)38第38页,本讲稿共79页Linux shell程序设计39第39页,本讲稿共79页Linux shell程序设计bash中执行整数算术运算的命令
28、是中执行整数算术运算的命令是let,语法格式:语法格式:let arg例:例:let“j=i*6+2”等价于等价于(j=i*6+2)40第40页,本讲稿共79页Linux shell程序设计优优先先级级运算符运算符结结合性合性功能功能、从右至左从右至左取表达式取表达式负值负值、正、正值值!、!、从右至左从右至左逻辑逻辑非、按位取反非、按位取反从左至右从左至右方方幂幂、从左至右从左至右乘、除、取模乘、除、取模、从左至右从左至右加、减加、减从左至右从左至右左移若干二左移若干二进进制位、右移若干二制位、右移若干二进进制位、制位、41第41页,本讲稿共79页Linux shell程序设计、=、=从左至
29、右从左至右大于、大于或等于、小于、小于或等于大于、大于或等于、小于、小于或等于、!、!从左至右从左至右相等、不相等相等、不相等&从左至右从左至右按位与按位与从左至右从左至右按位异或按位异或从左至右从左至右按位或按位或&从左至右从左至右逻辑逻辑与与|从左至右从左至右逻辑逻辑或或?:?:从右至左从右至左条件条件计计算算、&=、=、|=、=从右至左从右至左赋值赋值运算且运算且赋值赋值42第42页,本讲稿共79页Linux shell程序设计注意:当表达式中有注意:当表达式中有shell特殊字符时,必须用双引号括起来。特殊字符时,必须用双引号括起来。例:例:$let“v=6|5”$echo$v$let
30、 v=6|5显示结果为7结果提示出错,把|看成管道符,左右两边由于不是命令因而无法正确执行43第43页,本讲稿共79页Linux shell程序设计if语句一般格式:语句一般格式:if 测试条件测试条件 then 命令命令 else命令命令 fi 44第44页,本讲稿共79页Linux shell程序设计例:例:if test -f “$1”then echo“$1 is an ordinary file.”else echo“$1 is not an ordinary file.”fi通过通过test命令测试命令测试$1是否是一个已存在的普通文件,是否是一个已存在的普通文件,如果是则显示如果
31、是则显示$1 is an ordinary file.否则显示否则显示$1 is not an ordinary file45第45页,本讲稿共79页Linux shell程序设计例:例:if test -f “$1”then echo“$1 is an ordinary file.”else echo“$1 is not an ordinary file.”fi用用test命令或一对方括号括起来是等价的,命令或一对方括号括起来是等价的,test f “$1”等价于等价于 f “$1”46第46页,本讲稿共79页Linux shell程序设计条件测试命令条件测试命令test()文件测试运算符及
32、其功能()文件测试运算符及其功能参数参数功能功能-r文件名文件名若文件存在并且是用若文件存在并且是用户户可可读读的,的,则测试则测试条件条件为为真真-w文件名文件名若文件存在并且是用若文件存在并且是用户户可写的,可写的,则测试则测试条件条件为为真真-x文件名文件名若文件存在并且是用若文件存在并且是用户户可可执执行的,行的,则测试则测试条件条件为为真真-f文件名文件名若文件存在并且是普通文件,若文件存在并且是普通文件,则测试则测试条件条件为为真真-d文件名文件名若文件存在并且是目若文件存在并且是目录录文件,文件,则测试则测试条件条件为为真真-p文件名文件名若文件存在并且是命名的文件,若文件存在并
33、且是命名的文件,则测试则测试条件条件为为真真-b文件名文件名若文件存在并且是若文件存在并且是块设备块设备文件,文件,则测试则测试条件条件为为真真-c文件名文件名若文件存在并且是字符若文件存在并且是字符设备设备文件,文件,则测试则测试条件条件为为真真-s文件名文件名若文件存在并且文件若文件存在并且文件长长度大于,度大于,则测试则测试条件条件为为真真-t文件描述字文件描述字如果文件被打开其文件描述字是与如果文件被打开其文件描述字是与终终端端设备设备相关的,相关的,则测试则测试条件条件为为真真47第47页,本讲稿共79页Linux shell程序设计()有关字符串方面的测试()有关字符串方面的测试参
34、数参数功能功能-z s1如果字符串如果字符串s1的的长长度度为为,则测试则测试条件条件为为真真-n s1如果字符串如果字符串s1的的长长度大于,度大于,则测试则测试条件条件为为真真s1如果字符串如果字符串s1不是空字符串,不是空字符串,则测试则测试条件条件为为真真s1=s2如果如果s1等于等于s2,则测试则测试条件条件为为真真s1!s2 如果如果s1不等于不等于s2,则测试则测试条件条件为为真真s1s2如果按字典如果按字典顺顺序序s1在在s2之后,之后,则测试则测试条件条件为为真真48第48页,本讲稿共79页Linux shell程序设计()有关数值方面的测试()有关数值方面的测试参数参数功能
35、功能n1 eq n2如果整数如果整数n1等于等于n2,则测试则测试条件条件为为真真n1 ne n2如果整数如果整数n1不等于不等于n2,则测试则测试条件条件为为真真n1 lt n2如果整数如果整数n1小于小于n2,则测试则测试条件条件为为真真n1 le n2如果整数如果整数n1小于或等于小于或等于n2,则测试则测试条件条件为为真真n1 gt n2如果整数如果整数n1大于大于n2,则测试则测试条件条件为为真真n1 ge n2如果整数如果整数n1大于或等于大于或等于n2,则测试则测试条件条件为为真真49第49页,本讲稿共79页Linux shell程序设计()逻辑运算符()逻辑运算符参数参数功能功
36、能!放在任意放在任意逻辑逻辑表达式之前,使原来的表达式表达式之前,使原来的表达式变为变为假假-a放在两个放在两个逻辑逻辑表达式之表达式之间间,当两个表达式,当两个表达式为为真真时时,结结果果为为真真-o放在两个放在两个逻辑逻辑表达式之表达式之间间,其中只要一个表达式,其中只要一个表达式为为真真时时,结结果就果就为为真真()把一个把一个逻辑逻辑表达式括起来,使其表达式括起来,使其优优先得到运算先得到运算50第50页,本讲稿共79页Linux shell程序设计(5)特殊条件测试)特殊条件测试:表示不作任何事情,退出值为:表示不作任何事情,退出值为0ture表示总为真,退出值总是表示总为真,退出值
37、总是0false表示总为假,退出值总是表示总为假,退出值总是25551第51页,本讲稿共79页Linux shell程序设计case语句,一般语法形式为语句,一般语法形式为 case 字符串字符串 in 模式字符串模式字符串1)命令命令 命令;命令;模式字符串模式字符串2)命令命令 命令;命令;模式字符串模式字符串n)命令命令 命令;命令;esac执行过程如下:用字符串依次同各模式字符串进行比执行过程如下:用字符串依次同各模式字符串进行比较,如果发现某一个匹配,那就执行该模式字符串之较,如果发现某一个匹配,那就执行该模式字符串之后的命令,直至遇到两个分号为止;如果没有任何模后的命令,直至遇到两
38、个分号为止;如果没有任何模式字符串与该字符串的值相符合,则不执行任何命令式字符串与该字符串的值相符合,则不执行任何命令注意:注意:(1)每个模式字符串后面可有一条或多条命令,其最后一条命令)每个模式字符串后面可有一条或多条命令,其最后一条命令必须用两个分号结束;必须用两个分号结束;(2)模式字符串中可以使用通配符;)模式字符串中可以使用通配符;(3)如果模式字符串中包含多个模式,那么各模式之间应以竖线)如果模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是或的关系;()隔开,表示各模式是或的关系;(4)各模式字符串应)各模式字符串应是唯一的,不重复出现;是唯一的,不重复出
39、现;(5)要以)要以case开头以开头以esac结束;结束;(6)case的返回值是整个结构中最后执行的那个命令的的返回值是整个结构中最后执行的那个命令的退出值,若没有执行任何命令,则返回值为退出值,若没有执行任何命令,则返回值为052第52页,本讲稿共79页Linux shell程序设计while语句一般语法形式语句一般语法形式为:为:while 测试条件测试条件do 命令表命令表done执行过程如下:先进行条件测试,执行过程如下:先进行条件测试,如果结果为真则进入循环体,执行如果结果为真则进入循环体,执行其中的命令;然后再作条件测试其中的命令;然后再作条件测试,直至测试条件为假才终止,直至
40、测试条件为假才终止while语句的执行。语句的执行。53第53页,本讲稿共79页Linux shell程序设计until语句一般语法语句一般语法形式如下:形式如下:until 测试条件测试条件do 命令表命令表done执行过程如下:测试条件执行过程如下:测试条件为假时进入循环体,直至为假时进入循环体,直至测试条件为真时终止循序测试条件为真时终止循序54第54页,本讲稿共79页Linux shell程序设计for 变量变量 in 值表值表do 命令表命令表done执行过程如下:变量依次取值表里的各个值,执行过程如下:变量依次取值表里的各个值,然后执行命令表然后执行命令表for语法一般语法主要有三
41、种,(语法一般语法主要有三种,(1)格式一:)格式一:55第55页,本讲稿共79页Linux shell程序设计例:例:for day in Monday Wednesday Friday Sundaydo echo$daydone执行过程如下:变量执行过程如下:变量day依次取值表里的各个值,依次取值表里的各个值,第一次将第一次将Monday赋给赋给day,然后执行命令,然后执行命令“echo$day”;第二次将;第二次将Wednesday赋给赋给day for语法一般语法主要有三种,(语法一般语法主要有三种,(1)格式一:)格式一:56第56页,本讲稿共79页Linux shell程序设计
42、for 变量变量 in 文件正则表达式文件正则表达式do 命令表命令表done执行过程如下:取当前目录下与正则表达执行过程如下:取当前目录下与正则表达式相匹配的文件名,每取值依次就进入循式相匹配的文件名,每取值依次就进入循环体执行命令表一次环体执行命令表一次for语法一般语法主要有三种(语法一般语法主要有三种(2)格式二:)格式二:57第57页,本讲稿共79页Linux shell程序设计例:例:for file in m*.cdo cat$file|prdone执行过程如下:将当前目录下所有以执行过程如下:将当前目录下所有以m开头的开头的C程序文件按分页格式显示出来程序文件按分页格式显示出来
43、for语法一般语法主要有三种(语法一般语法主要有三种(2)格式二:)格式二:58第58页,本讲稿共79页Linux shell程序设计for i in$*do 命令表命令表done for i do或者或者 命令表命令表 donefor语法一般语法主要有三种(语法一般语法主要有三种(3)格式三:)格式三:执行过程如下:变量执行过程如下:变量i依次取位置参数的值,然后执行循依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止环体中的命令表,直至所有位置参数取完为止59第59页,本讲稿共79页Linux shell程序设计位置参数:执行位置参数:执行UNIX/Linux命令或命令
44、或Shell脚本时,脚本时,Shell传传递给脚本的参数,递给脚本的参数,例:例:bash ex1 /home/l1 ex15 ex16 ex17实参实参$0$1$2$3$4注意:注意:$0始终对应脚本名,不能为空;其他位置变量的值可以为空始终对应脚本名,不能为空;其他位置变量的值可以为空串串位置参数位置参数60第60页,本讲稿共79页Linux shell程序设计例:例:bash ex1 /home/l1 ex15 ex16 ex17$0$1$2$3$4注意:注意:shift移动位置命令,每执行一次,实参就左移一位,相移动位置命令,每执行一次,实参就左移一位,相当于位置参数右移一位当于位置参
45、数右移一位位置参数:执行位置参数:执行UNIX/Linux命令或命令或Shell脚本时,脚本时,Shell传递传递给脚本的参数,给脚本的参数,61第61页,本讲稿共79页Linux shell程序设计例:例:命令行:命令行:bash ex7 A B C D E F$0$1$2$3$4shift后后位置参数位置参数原位置:原位置:参参 数数$5$6$0$1$2$3$4$562第62页,本讲稿共79页Linux shell程序设计请解释下列程序并给出最终结果请解释下列程序并给出最终结果#ex8echo$0$1$2$3$4$5$6$7$8$9shiftecho$0$1$2$3$4$5$6$7$8$9
46、shift 4echo$0$1$2$3$4$5$6$7$8$9$bash ex8 A B C D E F G H I J K63第63页,本讲稿共79页Linux shell程序设计最终结果最终结果:ex8 A B C D E F G H Iex8 B C D E F G H I Jex8 F G H I J K64第64页,本讲稿共79页Linux shell程序设计break命令语法格式:命令语法格式:break命令可以从循环体中退出来;命令可以从循环体中退出来;continue命令语法格式:命令语法格式:continue命令跳过循环体中它之后的语句命令跳过循环体中它之后的语句回到本层循环
47、的开头进行下一次循环;回到本层循环的开头进行下一次循环;exit命令一般格式:命令一般格式:exit n 退出正在执行的退出正在执行的shell脚本,脚本,n是设定是设定的退出值;如未设定的退出值;如未设定n的值,则退出值为最后一命令的执行状态。的值,则退出值为最后一命令的执行状态。65第65页,本讲稿共79页Linux shell程序设计66第66页,本讲稿共79页Linux shell程序设计67第67页,本讲稿共79页Linux shell程序设计68第68页,本讲稿共79页Linux shell程序设计69第69页,本讲稿共79页Linux shell程序设计select语句语法形式:
48、语句语法形式:select identifier in worddo 命令表命令表done用于菜单的设计,自动完成接收用户输入的整个过程用于菜单的设计,自动完成接收用户输入的整个过程70第70页,本讲稿共79页Linux shell程序设计71第71页,本讲稿共79页Linux shell程序设计72第72页,本讲稿共79页Linux shell程序设计函数定义格式:函数应先定义,后使用。调用函数函数定义格式:函数应先定义,后使用。调用函数时,直接利用函数名,不必带圆括号,就像命令一样。时,直接利用函数名,不必带圆括号,就像命令一样。function 函数名()函数名()命令表命令表73第73
49、页,本讲稿共79页Linux shell程序设计74第74页,本讲稿共79页Linux shell程序设计75第75页,本讲稿共79页作 业请解释下列程序并给出最终结果请解释下列程序并给出最终结果echo“Enter two numbers”read x y(z=x+y)if z gt 10 then echo“x+y10”else echo“x+y10”fi76第76页,本讲稿共79页作 业1、写一个脚本文件写一个脚本文件checkuser,该脚本运行时带一个用户名作该脚本运行时带一个用户名作为参数,具体要求如下:为参数,具体要求如下:(1)如果命令行格式不符合要求,应有错误提示信息;)如果命令行格式不符合要求,应有错误提示信息;(2)在)在/etc/passwd文件中查找是否有该用户,文件中查找是否有该用户,如有,则输出如有,则输出“Found in the/etc/passwd file.”否则,输出否则,输出“No such on our system”77第77页,本讲稿共79页作 业注意事项:注意事项:(1)需要了解)需要了解/etc/passwd文件的内容;文件的内容;(2)编写程序;)编写程序;78第78页,本讲稿共79页作 业79第79页,本讲稿共79页
限制150内