《第五章 shell编程.ppt》由会员分享,可在线阅读,更多相关《第五章 shell编程.ppt(90页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章第五章 shellshell程序设计程序设计1、硬件硬件2、内核、内核(kernel)3、Shell进程管理存储管理设备管理文件管理网络功能1、UNIX外的一层“壳”,它是UNIX与用户的界面。2、Shell承担键盘命令行解释程序的功能,把用户的指令转译成UNIX系统能够理解的意义,交系统执行3、Shell同时又是一种程序设计语言UNIX系统的层次结构1一、Shell简介1、Shell分类分类 BourneshellCshell标准Shell,其发明人S.R.Bourne,因此也称BShellBShell的语法和功能较这其它Shell简单;程序设计方便,并且程序执行快捷;缺省提示符为“$
2、”特点:BShell的语法和功能较这其它Shell简单;程序设计方便,并且程序执行快捷;缺省提示符为“$”特点:加州大学Berkeley分校首先使用的Shell,其语法与C语言类似。提供了许多便于交互的功能,如别名(alias)、文件名自动匹配及历史记录等,可减少用户的击键次数,节省输入时间。缺省提示符为“%”特点:2一、Shell简介KornShellKornShell是AT&T贝尔实验室DavidKorn所开发,是Bourneshell的增强版本,综合了BShell和CShell的特点和约定,并且比BShell和CShell的执行速度更快。Kornshell的默认提示与环境文件,跟BShe
3、ll一样“$”。用户注册后运行哪个Shell是可以改变的,如果要求系统管理员把/bin/csh改为/bin/sh,那么用户注册后启动的不是CShell,而是BShellchr:*:103:100:hujs:/home/chr:/bin/csh3一、Shell简介2、Shell工作环境工作环境USER:运行该shell的用户名HOME:该用户的注册目录TERM:用户使用的终端类型PATH:所选择的命令搜索路径每一Shell进程都有一些特定的变量来表征它当时的属性:4一、Shell简介2、Shell工作环境工作环境在UNIX系统中,根据所启动的Shell的不同,UNIX执行不同的文件来设置相应的属
4、性。由于UNIX是多用户系统,每个用户都可以建立与其他用户不同的运行环境,因此这些文件放在每一用户的注册目录中。在BShell进程启动时,系统执行用户注册目录中的.profile文件,设置Shell变量的值;如果用户启动CShell进程,系统会执行注册目录中的.cshrc和.login文件来设置相应的属性。5一、Shell简介2、Shell工作环境工作环境CShell两个隐藏文件的几点说明:1)哪些命令要写到哪个文件,只有一些约定俗成的习惯。将Shell变量的设置或赋值放在.cshrc文件中,将环境变量及终端特性的设置放在.login,并没有是严格的规定。但要注意不能写重2)文件中的命令可以在
5、Shell运行时在交互方式下使用。%setpath=($path/home/chr/temp)这种改变仅在当前Shell下起作用,在Shell退出之后便不起作用了。如果要使其长期有效,则应写到.cshrc文件中6一、Shell简介2、Shell工作环境工作环境)如果用户的注册目录中没有这两个文件,则系统采用缺省设置系统的缺省设置位于usr/lib或某个有关的目录中(依所采用的UNIX的不同而不同)。用户可将其复制到自己的注册目录中,根据自己的喜好进行调整。)用户在编辑修改自己的两个隐藏文件后,它们并不能立即起作用如果要使其在当前Shell下起作用,可用下列命令:%source.login%so
6、urce.cshrc73、通配符及特殊字符、通配符及特殊字符 1)通配符)通配符*匹配任意字符串,但不包括以“.”开头的串;?匹配任一个字符;匹配方括号所括住的字符组。%lsl*.c%duflt*.dat一、Shell简介83、通配符及特殊字符、通配符及特殊字符 1)通配符)通配符*.c匹配所有后缀带.c的文件名;*test.c匹配所有文件名的后半部分为test.c的文件名;abcd匹配文件名abd,acd;a?d匹配所有以a开头,以c结尾,a与c这间只有一个字符的文件名,如abc,adc,a.ca-z*所有以小写字母开头的文件名例:一、Shell简介93、通配符及特殊字符、通配符及特殊字符
7、2)特殊字符特殊字符;标志命令行结束,但不换行;|管道线标志;输入输出重定向;$变量的访问(取值);转义字符,它其后字符失在Shell中的特殊意义除通配符外,还有一些字符对UNIX具有特殊意义,称为了特殊字符。一、Shell简介103、通配符及特殊字符、通配符及特殊字符 2)特殊字符特殊字符 此外,各种括号也有其特殊的作用,如小括号()括住的是一串命令,Shell创建一个子Shell执行;小括号()在csh的流程控制中,还用来括住if和while的流程控制表达式。在sh中,中括号可以代替test命令执行流程控制的判断功能。在Shell流程控制令还可以利用命令表执行的出口状态来进行判断,命令表用
8、大括号括住。一、Shell简介113、通配符及特殊字符、通配符及特殊字符 3)转义字符转义字符$echo*file1file2file3$echo*”*”*file1file2file3*转义字符的作用是取消特殊字符在Shell中的特殊含义。反斜线、单引号、双引号”,都使*失去了在Shell中的特殊含义,使echo命令回送字符*本身一、Shell简介123、通配符及特殊字符、通配符及特殊字符 3)转义字符转义字符 转义字符使其后的那个字符失去在Shell中的特殊意义;单引号的作用,是不对所括的通配符进行解释,从而使其失去它在Shell中的特殊意义;双引号对不包括反斜线,单引号,双引号”,及$号
9、的字符串来说,与单引号作用相同,对于包括上述特殊字符的内容,要进行命令和参数的替换。(p64)一、Shell简介13UNIX的Shell即是一种命令行解释程序,也是一种程序设计语言。Shell是一种解释性的程序设计语言,不像其他高级语言要先把源程序经过编译形成目标程序,再连接成可执行的目标码方可执行。对程序语句逐行解释,逐行执行。一、Shell简介4、Shell 程序及其执行程序及其执行144、Shell 程序及其执行程序及其执行Shell程序(program),又称为Shell脚本(script),Shell命令文件,Shell过程(procedure)一个简单的Shell程序可以只由一个或
10、几个简单的命令构成,而调试X窗口示例程序unixwin.c,要反复执行编辑、编译连接和程序执行三个步骤:一、Shell简介15$bashrun.shbasicwin4、Shell 程序及其执行程序及其执行其中basicsin是传递给程序run.sh对应于$1的实参。由于文本文件的缺省许可机制为rw-r-r-(644),即无论谁都没有执行权。所以在执行程序时,使用以下格式。$bashrun.shbasicwin一、Shell简介164、Shell 程序及其执行程序及其执行 实际上Shell程序比较复杂,程序中往往要用到变量及其赋值,用到流程控制。由于不同的Shell程序设计语言的变量定义及流程控
11、制的语法各有不同,所以应指明是那种Shell语言编写。为此,一般要求在程序的第1行开头处写上:#!/bin/sh或#!/bin/cshShell程序中,可以用#来标志其后的文本是注释一、Shell简介175、简单的、简单的Shell 程序程序$moremyscript#!/bin/cshdatecal$一、Shell简介18二、二、Shell程序设计程序设计1、Shell 两个基本命令两个基本命令在一个程序行中,字符#以后的部分被Shell看成是注释部分而不去解释,例如:1)注释(Comment)$moremyscript#!/bin/csh#Thisisacomment#.19二、二、She
12、ll程序设计程序设计1、Shell 两个基本命令两个基本命令echo命令用来在标准输出上显示跟随其后的字符,echo命令是在Shell程序中最常用的命令,例如:2)echo命令$echoHelloThereHelloThere$注意:echo显示内容后会自动加上换行符202、Shell 变量变量Shell变量一般分为三种:用户定义变量,环境变量,系统变量。其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用($n),环境变量主要是在程序运行的时候需要设置。又可分为全局和局部变量,环境变量在退出Shell后仍然起作用,所以称为全局变量。在UNIX系统中,环境变量名一般有些
13、是约定俗成(P62)。二、二、Shell程序设计程序设计212、Shell 变量变量变量:在程序执行过程中允许改变的量UNIXShell程序设计语言的变量类型比较简单,只有字符类型的变量,也就是说变量的值都有是字符或字符串。程序中出现的数字,也是基于字符类型。变量名:以字母开头,由字母、数字和下划线组成;变量值:是一些字符串;1)用户定义变量二、二、Shell程序设计程序设计222、Shell 变量变量$a=10$echo$a语法结构:变量=字符串或数值要取得变量的值,需要在变量名前加上$符号,例如:注注:在:在B Shell的变量赋值中的变量赋值中不允许不允许在等号(在等号(=)的两边)的两
14、边有有空格空格出现出现。1)用户定义变量二、二、Shell程序设计程序设计23在变量取值时可以用大括号把变量括住,以便强调指出变量名(程序vary)$echo$mc(取变量mc的值)$echo$hitoday(取变量hi的值,并和today组合)$echo”$mc”(取变量mc的值)$echo”$hi”today(取变量hi的值,并和today组合)2、Shell 变量变量1)用户定义变量二、二、Shell程序设计程序设计24访问Shell变量的值时,应在变量名前加$echo$mc(取变量mc的值)medical.cumt$echo$abc(abc的值是空串,无显示)2、Shell 变量变量1
15、)用户定义变量二、二、Shell程序设计程序设计25%echo$hitoday$hitoday单引号使其括住的特殊字符失去在Shell中的特殊含义;双引号”在遇到$等特殊字符时,会进行变量或参数的替换;反引号可以进行命令结果的替换2、Shell 变量变量1)用户定义变量二、二、Shell程序设计程序设计262、Shell 变量变量$moremyscript#!/bin/shcommand=”ls”options=”-l”filespec=”*.doc”或filespec=”$command$options$filespec1)用户定义变量(s1t3)二、二、Shell程序设计程序设计27二、二
16、、Shell程序设计程序设计2、Shell 变量变量2)预定义变量和环境变量预定义变量和环境变量 用户可以自己命名变量并为变量赋值,但有些名字如USER、HOME、PATH等,已被系统采用,用户不应再用它们作为变量名。Shell的这些是系统“预定义”的变量,系统会在创建Shell进程时为预定义变量自动赋值。有些预定义变量的值对某一特定用户的特定Shell是不能随便改变的(如HOME等);有的预定义变量的值则可以随用户的命令而改变(如PATH等)。28二、二、Shell程序设计程序设计2、Shell 变量变量2)预定义变量和环境变量预定义变量和环境变量预定义变量也称为内置环境变量:BSh变量Cs
17、h变量/环境变量用户名userUSER用户注册目录HOMEhomeHOME命令访问路径PATHpathPATHCd命令路径CDPATHcdpath提示符PS1prompt辅助提示符PS2终端类型TERMtermTERM进行的ShellSHELLshell29二、二、Shell程序设计程序设计2、Shell 变量变量2)预定义变量和环境变量预定义变量和环境变量环境变量:可以把变量值传到子Shell中变量,因此环境变量也是全局变量。注意:在BShell中环境变量被设置以后,必须用export命令才能使变量起作用$PATH=.:/bin:/usr/bin:/local/bin$exportPATH3
18、0二、二、Shell程序设计程序设计2、Shell 变量变量3)系统变量系统变量格式意义$0Shell命令或程序名$1$9从1到9的命令参数$*所有命令参数$#命令参数的个数$?前个命令返回的状态值(exitvalue)$-强制设定当前使用Shell的选项$当前使用中Shell的进程识别码pidShell本身有一些变量属于系统变量,这些变量只有Shell可以设置,用户只能引用。31二、二、Shell程序设计程序设计2、Shell 变量变量3)系统变量系统变量 当用户执行一个Shell命令时,Shell将创建10个位置参数,分别用$0,$1,$2,$9表示。其中$0表示所指行的Shell命令或程
19、序名,而$1,$2,$9则依次表示第1个,第2个,第9个命令行参数。32二、二、Shell程序设计程序设计2、Shell 变量变量3)系统变量系统变量一般情况下,$与$*的作用相同,表示除$0以外的位置参数。但在有双引号”时意义不同(p78)。”$*”对应于”$1,$2,$9”为一个字符串;”$”对应于”$1”,”$2”,”$9”为分开的字符串。33AABBCCDDEEFFGGHH%cattest.sh(test.sh)echo$1$2$3$4$5$6$7$8%chmod+xtest.sh%test.shAABBCCDDEEFFGGHH二、二、Shell程序设计程序设计2、Shell 变量变量
20、3)系统变量系统变量34shift:Shell在执行shift命令之后,将把$1置换为$2,而$2置换为$3,依次类推。二、二、Shell程序设计程序设计2、Shell 变量变量3)系统变量系统变量35二、二、Shell程序设计程序设计3)系统变量系统变量(s1t4)$catfile1abcdefghij$echo$#$*10abcdefghij$shift$echo$#$*$shift$echo$#$*$shift9bcdefghij8cdefghij$echo$#$*$shift$echo$#$*$shift7defghij6efghij$1$2$3$4$5$6$7$8$9$1036二、二
21、、Shell程序设计程序设计3)系统变量系统变量$echo$#$*$shift$echo$#$*$shift$echo$#$*$shift$echo$#$*$shift5fghij4ghij3hij2ij1j$echo$#$*37二、二、Shell程序设计程序设计3)系统变量系统变量hellogoodmorningeveryone%$cattest.sh(s1t5)echo$1shiftecho$1$2$3$test.shhellogoodmorningeveryone38二、二、Shell程序设计程序设计3)系统变量系统变量$chmod+xtest.shAABBCC$test.shAABBC
22、Cux=$1;uy=$2uz=$3echo$uxecho$uy$uz$cattest.sh(s1t6)39二、二、Shell程序设计程序设计2、Shell 变量变量4)变量的作用域:变量的作用域:局部变量局部变量和和全局变量全局变量40二、二、Shell程序设计程序设计2、Shell 变量变量4)变量的作用域:局部变量和全局变量变量的作用域:局部变量和全局变量41二、二、Shell程序设计程序设计2、Shell 变量变量4)变量的作用域:局部变量和全局变量变量的作用域:局部变量和全局变量一般情况下,变量仅在给其赋值的Shell上起作用,即为局部变量。export命令可将局部变量转化为全局变量;
23、$exportmc42二、二、Shell程序设计程序设计3、变量和命令替换、变量和命令替换(1)$name:-word如果name有值且非空,取该值,否则取word为它的值,但name变量本身的值不变;(2)$name:+word若变量name有值且非空,取word为它的值,否则name的值不变(仍为空);(3)$name:=word如果name有值且非空,取该值,否则取word为它的值,同时将word赋给变量name,则name被赋值见s1t1(4)$name:?word测试是否对name赋值,若赋,结果为name的值,否则显示word并退出43二、二、Shell程序设计程序设计$name1
24、=car$name2=boat$echo$name1car$echo$name2boat$echo$name3temtem$echo$name1:seatdoorcardoor$echo$name3:seatdoorseatdoor$echo$name1:+seatseat$echo$name1:=planecar$echo$name3:=planeplane3、变量和命令替换、变量和命令替换 name3?44二、二、Shell程序设计程序设计BShell和CShell都提供了一种利用命令的执行结果替换给变量的赋值方法,这就是利用反引号的命令替换。把一个命令用反引号括起来,就可以把命令的执行结
25、果赋给一个变量。3、变量和命令替换、变量和命令替换 45二、二、Shell程序设计程序设计$now=date$echo$nowTueDec1023:22:12CST20023、变量和命令替换、变量和命令替换 见s1t746单引号括在单引号中的字符一律当作普通字符解释,特殊字符失去在Shell中的特殊含义;(2P38)二、二、Shell程序设计程序设计4 4、shell变量运算变量运算 A=goodboyecho$Agoodboy反斜杠反斜杠后面字符的特殊含义被取消(P65)反引号反单引号中的内容被看成是命令(P66)双引号”,除美元符号$、反撇号、反斜杠以外,其余的作为字符串不加处理直接传送给
26、程序。在遇到$等特殊字符时,会进行变量或参数的替换;(P65,2P38)A=abcB=“Thevalueis$A”echo$BThevalueisabcThisdateis:datename=“swpu”echo$nameecho$nameswpu$name47Shell有一个专门的命令expr,用于对整数实施算术运算、逻辑运算和字符串比较。由于expr将每个字符和数字都看作是独立的变元,所以用空格将运算符和值隔开。(s2t6)二、二、Shell程序设计程序设计4 4、shell变量运算变量运算 例如:$c=expr$a+$b$d=expr$a/$b$e=expr$a*$b字符串比较$R=ex
27、prabcdefg:abcd(从第一个字符开始,完全一样)$echo$R注意:$a,$b和运算符之间一定要有空格。48二、二、Shell程序设计程序设计4 4、shell变量运算变量运算 49利用expr进行算术运算要注意:()、操作数和运算符之间要用空格分开,因为变量是字符类型,如果不用空格,可能被认为是同一个字符串。()、算式合法的运算符是:+、-、*、(或“*“、*)/和%。由于*和/在shell中有特殊意义,所以需要做转义处理。()、合法的操作数是整数二、二、Shell程序设计程序设计4 4、shell变量运算变量运算 50%expr5*10%expr5“*“10%expr5*10%e
28、xpr“5*10“%count=expr$count+1(s2t7)二、二、Shell程序设计程序设计4 4、shell变量运算变量运算 51课堂练习改写表达式(swpu):2*3+4/25*4+9%3计算goodafternoon和good匹配的字符数52首先通过vi创建一个Shell正文文件,然后使用chmod命令使文件变成可执行文件,最后键入该文件名即可执行该文件。二、二、Shell程序设计程序设计5 5、建立建立shell文件文件 例如,创建一个名为scr1的Shell文件$viscr1531、test 命令命令三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计test
29、是sh程序设计中的一个测试命令,其目的是测试其后的表达式的值,如果表达式的值为“真”,则test命令返回真值,即返回0;否则返回非0(1)。test命令格式:testexpr或expr%testd/home/usera&echo”directoryuseraexists”%testd/home/usera|echo”useranotexistsornotadir”541、test 命令命令test命令大量用于sh程序设计中的流程控制表达式的求值。可以对文件、字符串、数字(整数)表达式求值,也可进行表达式的简单组合。1)test命令用于对文件的测试格式:testdfrwxsfilename-df
30、ilename表示文件filename存在且为目录文件;-ffilename表示文件filename存在且为普通文件;-rfilename表示文件filename存在且可读;三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计551、test 命令命令-wfilename表示文件filename存在且可写;-xfilename表示文件filename存在且可执行;-sfilename表示文件filename存在且长度非零;%testd/home/usera%echo$?0三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计561、test 命令命令2)test命令用
31、于对字符串s进行测试tests字符串s非空串;testns字符串s非空串;testzs字符串s空串;tests1=s2字符串s1与s2相同;tests1!=s2字符串s1与s2不同;在利用test进行两个字符串的比较时,等号(=)和不等号(!=)的两边必须有空格,与sh变量的赋值相反。三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计571、test 命令命令3)test命令用于对整数n进行测试testn1eqn2整数n1和n2相等;testn1nen2整数n1和n2不相等;testn1ltn2整数n1小于n2;testn1len2整数n1小于等于n2;testn1gtn2整数
32、n1大于n2;testn1gen2整数n1大于等于n2。三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计581、test 命令命令如果shell变量的值是“整数”,但它仍是字符型变量。test命令对整数进行的测试比较是test对这些字符串类型的整数进行解释的结果。因此用“=”和“-eq”进行比较,机理是不同。s2t8三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计591、test 命令命令4)test测试的逻辑组合-a与-o或!非%testr/home/usera%testr/home/useraad/home/useratest命令也可用方括号代替:tes
33、tfmyfile可写作-fmyfile,方括号与参数之间要有空格隔开。三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计602、条件控制(if结构和case分支)结构化程序设计的三种基本结构:顺序结构:命令表分支结构:if和case语句循环结构:for、while和until循环三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计612、条件控制(if结构和case分支)1)if结构没有分支结构的条件控制。if语句可以实现更复杂的条件控制。if命令认为退出状态值为0时“TRUE”,而为其他值时为“FALSE”,与C语言是相反的。具有以下几种形式:第一种(P68,s
34、2t4):ifexpressionthencommandlistfi三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计622、条件控制(if结构和case分支)1)if结构第二种(P68,s2t4):ifexpressionthencommandlist1elsecommandlist2fi第三种(P69,s2t5):ifexpression1thencommandlist1elifexpression2thencommandlist2elsecommandlist3fi三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计63综合例题:用test命令来比较字符串P
35、69 用test命令来比较整数P7264流程控制编程例子流程控制编程例子if -r“$1”;then echo you have read permission on the file.fiif -w“$1”;then echo you have write permission on the file.fi if-x“$1”a!d“$1”;thenecho you have execute permission on the file.fi它检测你是否对该文件有执行权限以及文件是否不是一个目录(如果文件如果文件是一个目录,执行是一个目录,执行权限则意味着目录权限则意味着目录可否被打开可否被打
36、开)。操作符优先级就是操作符优先级就是shell处理操作符的次序。此概念与数学中的算术优处理操作符的次序。此概念与数学中的算术优先级一样。先级一样。-x“$1”a!d“$1”等价于等价于(-x“$1”)a(!d“$1”)。文件测试首先被文件测试首先被执行,然后是符号!,然后是执行,然后是符号!,然后是AND和和OR测试。测试。65脚本运行例子脚本运行例子作为以上输出一个例子,假定对当前目录执行ls-l,结果包含如下内容:-rwxr-xr-x 1 cam users 2987 Jan 10 20:43 adventure-rw-rr 1 cam users 30 Jan 10 21:45 ali
37、ce-rrr-1 root root 58379 Jan 11 21:30 coredrwxr-xr-x 2 cam users 1024 Jan 10 21:41 dodo$fileinfo adventure Youhavereadpermissiononthefile.Youhavewritepermissiononthefile.Youhaveexecutepermissiononthefile.662、条件控制(if结构和case分支)2)case分支三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计672、条件控制(if结构和case分支)2)case分支(P74,
38、75)casewordinpattern1)part1_list1;pattern2)part2_list1;?)default_list1;*)default_list2;esac三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计注意:“*”用来匹配任意值,”?”匹配一个字符682、条件控制(if结构和case分支)三、条件测试和简单的三、条件测试和简单的Shell程序设计程序设计691、循环(for、while和until循环)四、复杂的四、复杂的Shell程序设计程序设计701、循环(for、while和until循环)四、复杂的四、复杂的Shell程序设计程序设计 Sh
39、ell程序设计语言用程序设计语言用for、while和和until实现实现命令表命令表的的重复执行重复执行。和其它程序设计语言类似,。和其它程序设计语言类似,for循环常用于循环常用于循环次数确定循环次数确定的情况。的情况。while和和until常用于循环次数需要常用于循环次数需要根据条件根据条件判断判断的情况。的情况。1)for 循环(循环(P76)语法语法:for var in word1 word2 word3 wordn do commandlist done 711、循环(、循环(for、while和和until循环)循环)说明:说明:a)变量变量var的可能的取值的可能的取值wo
40、rd1 word2 word3 wordn 必须一一列出;必须一一列出;b)若省略若省略in及其后的取值表,则相当于有及其后的取值表,则相当于有in$*,系统系统 对每一个位置变量执行一次命令表;对每一个位置变量执行一次命令表;(p76-copy)c)在取值列表中可以采用通配符。在取值列表中可以采用通配符。1)for 循环循环 四、复杂的四、复杂的Shell程序设计程序设计721、循环(for、while和until循环)1)for循环#例:例:fruits.sh for fruits in apples pears oranges do echo$fruits are fruits done
41、apples are fruitspears are fruitsoranges are fruits四、复杂的四、复杂的Shell程序设计程序设计731、循环(、循环(for、while和和until循环)循环)2)while循环和循环和until循环循环 while循环和循环和until循环可以看作是循环可以看作是for循环和循环和if条件的功条件的功能的组合,二者都以一个能的组合,二者都以一个命令表命令表的的出口状态出口状态为判断条件,决为判断条件,决定循环中的命令表是否执行,差别在于第一次执行之前是否定循环中的命令表是否执行,差别在于第一次执行之前是否先判断,其语法:先判断,其语法:w
42、hile comdlist1 until comdlist1 do comdlist2 do comdlist2 done done四、复杂的四、复杂的Shell程序设计程序设计741、循环(、循环(for、while和和until循环)循环)2)while循环和循环和until循环循环 while循环和循环和until循环的判断条件可以是一个命令表循环的判断条件可以是一个命令表(comdlist),),循环根据循环根据命令表的最后命令表的最后的出口状态是否的出口状态是否“真真”来决定下一个命令表是否执行。来决定下一个命令表是否执行。comdlist1的出的出口状态应能改变,否则程序将陷入死循
43、环口状态应能改变,否则程序将陷入死循环#例:例:while.sh while -f filea do echo Before sleep sleep 5 echo sleep done done四、复杂的四、复杂的Shell程序设计程序设计751、循环(、循环(for、while和和until循环)循环)2)while循环和循环和until循环循环例题例题(s2t9):count=1 while -n$*do echo this is a parameter number$count$1 shift count=expr$count+1 done四、复杂的四、复杂的Shell程序设计程序设计7
44、61、循环(、循环(for、while和和until循环)循环)2)while循环和循环和until循环循环 例题例题(s2t10):count=1 until -z$*echo this is a parameter number$count$1 shift count=expr$count+1 done四、复杂的四、复杂的Shell程序设计程序设计771、循环(、循环(for、while和和until循环)循环)2)while循环和循环和until循环循环 until与与while语句具有类似的语法格式和功能语句具有类似的语法格式和功能,不同不同的是的是while中中expr的值为的值为T
45、rue时时,shell执行命令组执行命令组;而而until中当中当expr的值为的值为False时时,shell才执行那组命令才执行那组命令.四、复杂的四、复杂的Shell程序设计程序设计 每次执行到每次执行到until语句时都先执行循环语句块,然语句时都先执行循环语句块,然后测试后测试expr的值,的值,False时继续下一次循环,否则终止。时继续下一次循环,否则终止。781、循环(、循环(for、while和和until循环)循环)2)while循环和循环和until循环循环void main()int i(1),sum(0);while(i=10)sum+=i;i+;cout“sum=“
46、sumendl;四、复杂的四、复杂的Shell程序设计程序设计791、循环(for、while和until循环)3)shift命令由前面位置参数的学习可知,由前面位置参数的学习可知,UNIX只提供提了十个只提供提了十个位置变量,而且其中之一为指令本身,因此当指令的参数位置变量,而且其中之一为指令本身,因此当指令的参数超出九个时,就会出现问题。超出九个时,就会出现问题。Shell提供了提供了shift指令,使参指令,使参数能够数能够移位移位。这样便可将取用过和参数丢掉,把位置空出。这样便可将取用过和参数丢掉,把位置空出给下个参数使用。给下个参数使用。四、复杂的四、复杂的Shell程序设计程序设计
47、80%cat tshift%echo$#$*%shift%echo$#$*%shift%echo$#$*%shift%echo$#$*%shift%echo$#$*%shift$tshift a b c d e f g h i j 10a b c d e f g h i j 119 b c d e f g h i j 128 c d e f g h i j 137 d e f g h i j 146 e f g h i j 1、循环(for、while和until循环)3)shift命令四、复杂的四、复杂的Shell程序设计程序设计81%echo$#$*%shift%echo$#$*%shif
48、t%echo$#$*%shift%echo$#$*%shift%echo$#$*%shift5 f g h i j 4 g h i j 3 h i j 2 i j 1 j 1、循环(for、while和until循环)3)shift命令四、复杂的四、复杂的Shell程序设计程序设计821、循环(、循环(for、while和和until循环)循环)4)改变循环(改变循环(break和和continue语句)语句)break和和continue语句用来改变语句用来改变for、while和和until循环的执行,其机制和循环的执行,其机制和C语言中相同。语言中相同。Break退出当前退出当前所在的整
49、个循环,而所在的整个循环,而continue结束本轮循环,转到下结束本轮循环,转到下一轮循环的开始。一轮循环的开始。Bourne Shell语言没有语言没有go to语句。语句。四、复杂的四、复杂的Shell程序设计程序设计831、循环(、循环(for、while和和until循环)循环)4)改变循环(改变循环(break和和continue语句)语句)四、复杂的四、复杂的Shell程序设计程序设计8485 学习学习$0 变量就是命令本身,它除了可以是变量就是命令本身,它除了可以是Shell程序名外,还可以是符号连接名程序名外,还可以是符号连接名(P81)学习学习局部变量和外部变量:学习例题局
50、部变量和外部变量:学习例题(P82,3)注意:一个命令行中允许有多个命令,各注意:一个命令行中允许有多个命令,各个命令之间要用分号隔开,当命令太长时,可个命令之间要用分号隔开,当命令太长时,可用续行号用续行号将它们分成若干行将它们分成若干行86%more dotscript1#!/bin/shx=100echo “Before dotscript2:$x”dotscript2echo“After dotscript2:$x”2、进程命令、进程命令1)命令命令四、复杂的四、复杂的Shell程序设计程序设计命令可以使子命令可以使子Shell程序作为当前程序作为当前Shell程序的一部分运行程序的一