第五章shell编程

上传人:大米 文档编号:568580102 上传时间:2024-07-25 格式:PPT 页数:32 大小:185KB
返回 下载 相关 举报
第五章shell编程_第1页
第1页 / 共32页
第五章shell编程_第2页
第2页 / 共32页
第五章shell编程_第3页
第3页 / 共32页
第五章shell编程_第4页
第4页 / 共32页
第五章shell编程_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《第五章shell编程》由会员分享,可在线阅读,更多相关《第五章shell编程(32页珍藏版)》请在金锄头文库上搜索。

1、第五章第五章 shell 编程编程shell 编程的基本过程分为三步编程的基本过程分为三步:1. 建立建立 shell 文件文件 包含任意多行操作系统命令或包含任意多行操作系统命令或shell命令的文本命令的文本文件文件;2. 赋予赋予shell文件执行权限文件执行权限 用用chmod命令修改权限命令修改权限;3. 执行执行shell文件文件 直接在命令行上调用直接在命令行上调用shell程序程序.实例实例:1. 1. 建立建立建立建立shellshell文件文件文件文件 ( (可用任何建立文本文件的方法可用任何建立文本文件的方法可用任何建立文本文件的方法可用任何建立文本文件的方法): ):

2、$ cat prog1 $ cat prog1 who | who | grepgrep $1 $12. 2. 赋予执行权限赋予执行权限赋予执行权限赋予执行权限: (: (初始文本文件无执行权限初始文本文件无执行权限初始文本文件无执行权限初始文本文件无执行权限) ) $ $ chmod chmod 740 prog1740 prog13. 3. 执行该执行该执行该执行该shellshell程序程序程序程序 $ $ prog1 student5prog1 student5 prog1: not found prog1: not found (shell (shell在标准搜索目录中找不到在标准搜

3、索目录中找不到在标准搜索目录中找不到在标准搜索目录中找不到prog1prog1命令命令命令命令) )4. 4. 指定路径或修改环境变量指定路径或修改环境变量指定路径或修改环境变量指定路径或修改环境变量PATHPATH后执行后执行后执行后执行shellshell程序程序程序程序 $ ./$ ./prog1 student5prog1 student5 student5 tty06 Feb 8 09:12 student5 tty06 Feb 8 09:12shell 程序和语句程序和语句 shell shell 程序由零至多条程序由零至多条程序由零至多条程序由零至多条shellshell语句构成

4、语句构成语句构成语句构成. shell. shell语语语语句包括三大类句包括三大类句包括三大类句包括三大类: : 功能性语句、结构性语句和说明性功能性语句、结构性语句和说明性功能性语句、结构性语句和说明性功能性语句、结构性语句和说明性语句语句语句语句. .说明性语句说明性语句说明性语句说明性语句: 以以以以# #号开始到行尾的部分,不被解释执行号开始到行尾的部分,不被解释执行号开始到行尾的部分,不被解释执行号开始到行尾的部分,不被解释执行功能性语句功能性语句功能性语句功能性语句: : 任意的操作系统命令、任意的操作系统命令、任意的操作系统命令、任意的操作系统命令、shellshell内部命令

5、、自编内部命令、自编内部命令、自编内部命令、自编 程序、其它程序、其它程序、其它程序、其它shellshell程序名等。程序名等。程序名等。程序名等。结构性语句结构性语句结构性语句结构性语句: 条件测试语句、多路分支语句、循环语句、条件测试语句、多路分支语句、循环语句、条件测试语句、多路分支语句、循环语句、条件测试语句、多路分支语句、循环语句、 循环控制语句等。循环控制语句等。循环控制语句等。循环控制语句等。 说明性语句说明性语句(注释行注释行): 注释行可以出现在程序中的任何位置注释行可以出现在程序中的任何位置注释行可以出现在程序中的任何位置注释行可以出现在程序中的任何位置, ,既可以既可以

6、既可以既可以单独占用一行单独占用一行单独占用一行单独占用一行, , 也可以接在执行语句的后面也可以接在执行语句的后面也可以接在执行语句的后面也可以接在执行语句的后面. . 以以以以# #号号号号开始到所在行的行尾部分,都不被解释执行开始到所在行的行尾部分,都不被解释执行开始到所在行的行尾部分,都不被解释执行开始到所在行的行尾部分,都不被解释执行. . 例如例如例如例如: :# #! /bin/! /bin/shsh # # # # 本程序说明本程序说明本程序说明本程序说明# #command_1 command_1 command_2 # command_2command_2 # comman

7、d_2的的的的语句说明语句说明语句说明语句说明# # 下面程序段的说明下面程序段的说明下面程序段的说明下面程序段的说明command_mcommand_mcommand_n # command_n # commandncommandn_ _语句的说明语句的说明语句的说明语句的说明告诉告诉OS用哪种类型的用哪种类型的shell来解释执行该程序来解释执行该程序几个常用的功能性语句几个常用的功能性语句(命令命令): 1. 1.readread命令命令命令命令 readread从标准输入读入一行从标准输入读入一行从标准输入读入一行从标准输入读入一行, , 并赋值给后面的变量并赋值给后面的变量并赋值给后

8、面的变量并赋值给后面的变量, ,其语法为其语法为其语法为其语法为: : . read . read varvar 把读入的数据全部赋给把读入的数据全部赋给把读入的数据全部赋给把读入的数据全部赋给varvar . read var1 var2 var3 . read var1 var2 var3 把读入行中的第一个词把读入行中的第一个词把读入行中的第一个词把读入行中的第一个词(word)(word)赋给赋给赋给赋给var1, var1, 第第第第二个词赋给二个词赋给二个词赋给二个词赋给var2, var2, 把其余所有的词赋给最后一把其余所有的词赋给最后一把其余所有的词赋给最后一把其余所有的词赋

9、给最后一个变量个变量个变量个变量. . 如果执行如果执行如果执行如果执行readread语句时标准输入无数据语句时标准输入无数据语句时标准输入无数据语句时标准输入无数据, , 则程序则程序则程序则程序在此停留等侯在此停留等侯在此停留等侯在此停留等侯, , 直到数据的到来或被中止运行直到数据的到来或被中止运行直到数据的到来或被中止运行直到数据的到来或被中止运行. .应用实例应用实例# example1 for read# example1 for readecho Input your name: cecho Input your name: cread usernameread usernam

10、eecho Your name is $usernameecho Your name is $username#example2 for read#example2 for readecho Input date with format echo Input date with format yyyyyyyy mm mm dddd: c: cread year month dayread year month dayecho Today is $year/$month/$day, right?echo Today is $year/$month/$day, right?echo Press a

11、ny key to confirm and continuececho Press any key to confirm and continuecread answerread answerecho I know the date, bye!echo I know the date, bye!2. 2.expr 命令命令 算术运算命令算术运算命令算术运算命令算术运算命令exprexpr主要用于进行简单的整数运算,包主要用于进行简单的整数运算,包主要用于进行简单的整数运算,包主要用于进行简单的整数运算,包括加括加括加括加(+)(+)、减(、减(、减(、减(- -)、乘()、乘()、乘()、乘(

12、*)*)、整除(、整除(、整除(、整除(/ /)和求模()和求模()和求模()和求模(%)等操)等操)等操)等操作。例如作。例如作。例如作。例如: :$ $ exprexpr 12 + 5 * 3 12 + 5 * 32727$ $ exprexpr 3 - 8 / 2 3 - 8 / 2-1-1$ $ exprexpr 25 % 4 25 % 41 1$ num=9$ num=9$ sum=$ sum=exprexpr $num * 6 $num * 6 $ echo $sum$ echo $sum5454反斜线去掉反斜线去掉*号的元字符含义号的元字符含义反撇号引用命令的运行结果反撇号引用命

13、令的运行结果3. 3.tput 命令命令 tputtput命令主要用于设置终端工作模式命令主要用于设置终端工作模式命令主要用于设置终端工作模式命令主要用于设置终端工作模式, , 或读出终端控制或读出终端控制或读出终端控制或读出终端控制字符字符字符字符. . tputtput命令与终端控制代码数据库命令与终端控制代码数据库命令与终端控制代码数据库命令与终端控制代码数据库terminfoterminfo相连相连相连相连, , 根据根据根据根据shellshell环境变量环境变量环境变量环境变量TERMTERM的值的值的值的值, , 读出这种终端的指定功能控制代读出这种终端的指定功能控制代读出这种终

14、端的指定功能控制代读出这种终端的指定功能控制代码码码码. . 常用的终端功能控制如下表常用的终端功能控制如下表常用的终端功能控制如下表常用的终端功能控制如下表: :选项选项选项选项功功功功 能能能能选项选项选项选项功功功功 能能能能belbel终端响铃终端响铃终端响铃终端响铃el el光标位置到行末清字符光标位置到行末清字符光标位置到行末清字符光标位置到行末清字符blinkblink闪烁显示闪烁显示闪烁显示闪烁显示smsosmso启动突出显示模式启动突出显示模式启动突出显示模式启动突出显示模式boldbold粗体字显示粗体字显示粗体字显示粗体字显示smulsmul启动下划线模式启动下划线模式启

15、动下划线模式启动下划线模式clearclear清屏清屏清屏清屏rmsormso结束突出显示模式结束突出显示模式结束突出显示模式结束突出显示模式cup cup r cr c 光标移到光标移到光标移到光标移到 r r 行行行行 c c 列列列列rmulrmul结束下划线模式结束下划线模式结束下划线模式结束下划线模式dimdim显示变暗显示变暗显示变暗显示变暗revrev反白反白反白反白显示显示显示显示eded光标位置到屏幕底清屏光标位置到屏幕底清屏光标位置到屏幕底清屏光标位置到屏幕底清屏sgr0sgr0关闭所有属性关闭所有属性关闭所有属性关闭所有属性应用实例一应用实例一:# # program1

16、for # program1 for tputtput# #tputtput clear cleartputtput cup 11 30 cup 11 30tputtput rev revecho Hello, everybody!echo Hello, everybody!tputtput sgr0 sgr0tputtput cup 24 1 cup 24 1 该程序先清屏该程序先清屏该程序先清屏该程序先清屏, , 并在屏幕中央位置并在屏幕中央位置并在屏幕中央位置并在屏幕中央位置(11(11行行行行2323列列列列) )用反极性用反极性用反极性用反极性显示字符串显示字符串显示字符串显示字符串

17、Hello, everybody!, Hello, everybody!, 恢复正常显示极性后光恢复正常显示极性后光恢复正常显示极性后光恢复正常显示极性后光标标标标停留在屏幕左下角停留在屏幕左下角停留在屏幕左下角停留在屏幕左下角. .应用实例二应用实例二:# # program2 for # program2 for tputtput# #bell=bell=tputtput belbel s_ulines_uline=tputtput smulsmul e_ulinee_uline=tputtput rmulrmul tputtput clear cleartputtput cup 10 2

18、0 cup 10 20echo $bell $echo $bell $s_ulines_ulineecho Computer Departmentecho Computer Departmentecho $echo $e_ulinee_uline功能功能功能功能: : 响一声铃后响一声铃后响一声铃后响一声铃后, , 在清空的屏幕中央以下划线模式显示字在清空的屏幕中央以下划线模式显示字在清空的屏幕中央以下划线模式显示字在清空的屏幕中央以下划线模式显示字符串符串符串符串Computer DepartmentComputer Department注意注意在在$bell和和$s_uline之间之间的空

19、格将同样在屏幕上的空格将同样在屏幕上显示显示, 使使Computer Department的实际位置的实际位置向右移动一格向右移动一格结构性语句结构性语句: 结构性语句主要根据程序的运行状态、结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。主要包时间等因素来控制程序的运行流程。主要包括:条件测试语句(两路分支)、多路分支括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句、循环语句、循环控制语句和后台执行语句等。语句等。 无任何结构性语句的无任何结构性语句的shell程序是

20、一种特程序是一种特例。例。一一. 条件语句条件语句 ifthenfi语法结构语法结构语法结构语法结构: : if if 表达式表达式表达式表达式 then then 命令表命令表命令表命令表 fi fi 如果表达式为真如果表达式为真如果表达式为真如果表达式为真, , 则执行命令表中的命令则执行命令表中的命令则执行命令表中的命令则执行命令表中的命令; ; 否则退否则退否则退否则退出出出出if if语句语句语句语句, , 即执行即执行即执行即执行fi fi后面的语句后面的语句后面的语句后面的语句. . if if和和和和fi fi是条件语句的语句括号是条件语句的语句括号是条件语句的语句括号是条件语

21、句的语句括号, , 必须成对使用必须成对使用必须成对使用必须成对使用; ;命令表中的命令可以是一条命令表中的命令可以是一条命令表中的命令可以是一条命令表中的命令可以是一条, , 也可以是若干条也可以是若干条也可以是若干条也可以是若干条. .例子例子例子例子: : shell shell程序程序程序程序prog2, prog2, 测试命令行参数是否为已存在测试命令行参数是否为已存在测试命令行参数是否为已存在测试命令行参数是否为已存在的文件或目录的文件或目录的文件或目录的文件或目录. . 用法为用法为用法为用法为: : prog2 file prog2 file内容如下内容如下内容如下内容如下:

22、: #The statement of ifthen#The statement of ifthenfi fi ( (注释语句注释语句注释语句注释语句) )if -f $1 if -f $1 ( (测试参数是否为文件测试参数是否为文件测试参数是否为文件测试参数是否为文件) )thenthenecho File $1 exists echo File $1 exists ( (引用变量值引用变量值引用变量值引用变量值) )fi fiif -d $HOME/$1 if -d $HOME/$1 ( (测试参数是否为目录测试参数是否为目录测试参数是否为目录测试参数是否为目录) )then then e

23、cho File $1 is a directory echo File $1 is a directory ( (引用变量值引用变量值引用变量值引用变量值) )fi fi执行执行prog2程序程序:$ prog2 prog1$ prog2 prog1File prog1 existsFile prog1 exists $0$0为为为为prog2; $1prog2; $1为为为为prog1, prog1, 是一个已存在的文件是一个已存在的文件是一个已存在的文件是一个已存在的文件. .$ prog2 backup$ prog2 backupFile backup is directoryFile

24、 backup is directory $0$0为为为为prog2; $1prog2; $1为为为为backup,backup,是一个已存在的目录是一个已存在的目录是一个已存在的目录是一个已存在的目录. .如果不带参数如果不带参数如果不带参数如果不带参数, , 或大于一个参数运行或大于一个参数运行或大于一个参数运行或大于一个参数运行prog2, prog2, 例如例如例如例如: :$ $ prog2 (prog2 (或或或或 $ $ prog2 file1 file2)prog2 file1 file2)将会出现什么结果将会出现什么结果将会出现什么结果将会出现什么结果? ?二二. 条件语句条

25、件语句 ifthenelsefi语法结构为语法结构为语法结构为语法结构为: : if if 表达式表达式表达式表达式 then then 命令表命令表命令表命令表1 1 else else 命令表命令表命令表命令表2 2 fi fi如果表达式为真如果表达式为真如果表达式为真如果表达式为真, , 则执行命令表则执行命令表则执行命令表则执行命令表1 1中的命令中的命令中的命令中的命令, , 退出退出退出退出if if语句语句语句语句; ; 否则执行命令表否则执行命令表否则执行命令表否则执行命令表2 2中的语句中的语句中的语句中的语句, , 退出退出退出退出if if语句语句语句语句. .注意注意注

26、意注意: : 无论表达式是否为真无论表达式是否为真无论表达式是否为真无论表达式是否为真, , 都有语句要执行都有语句要执行都有语句要执行都有语句要执行. .例子例子例子例子: shell: shell程序程序程序程序prog3, prog3, 用法为用法为用法为用法为: : prog3 file prog3 file内容如下内容如下内容如下内容如下: :#The statement of ifthenelse#The statement of ifthenelsefi fiif -d $1 if -d $1 thenthenecho $1 is a directoryecho $1 is a

27、directoryexit (exit (退出当前的退出当前的退出当前的退出当前的shellshell程序程序程序程序) )else else if -f $1 if -f $1 thenthenecho $1 is a common fileecho $1 is a common fileelseelseecho unknown echo unknown fi fifi fi(如果没有如果没有如果没有如果没有exitexit语句,程序的执行结果是什么?)语句,程序的执行结果是什么?)语句,程序的执行结果是什么?)语句,程序的执行结果是什么?)运行运行prog3程序程序:$ prog3 bac

28、kup$ prog3 backupbackup is a directorybackup is a directory$ prog3 prog1$ prog3 prog1prog1 is a common fileprog1 is a common file$ prog3 $ prog3 abcabcunknownunknownprog3是对是对prog2的优化的优化, 逻辑结构更加清晰合理逻辑结构更加清晰合理!prog2的主要缺点是什么的主要缺点是什么?三三. 测试语句测试语句 testtesttest语句可测试三种对象语句可测试三种对象语句可测试三种对象语句可测试三种对象: : 字符串字符

29、串字符串字符串 整数整数整数整数 文件属性文件属性文件属性文件属性每种测试对象都有若干测试操作符每种测试对象都有若干测试操作符每种测试对象都有若干测试操作符每种测试对象都有若干测试操作符, , 参见表参见表参见表参见表8.148.14例如例如例如例如: : test $answer = yestest $answer = yes 变量变量变量变量answeranswer的值是否为字符串的值是否为字符串的值是否为字符串的值是否为字符串yesyes test $num test $num eqeq 18 18 变量变量变量变量numnum的值是否为整数的值是否为整数的值是否为整数的值是否为整数18

30、18 test -d test -d tmptmp 测试测试测试测试tmptmp是否为一个目录名是否为一个目录名是否为一个目录名是否为一个目录名 test命令的应用命令的应用: test test命令测试的条件成立时命令测试的条件成立时命令测试的条件成立时命令测试的条件成立时, , 命令返回值为真命令返回值为真命令返回值为真命令返回值为真(0)(0) 否则返回值为假否则返回值为假否则返回值为假否则返回值为假( (非非非非0).0). 用法一用法一用法一用法一. . test $name - test $name -eqeq $1 $1 echo $? echo $? 用法二用法二用法二用法二.

31、 . if test -f $filename if test -f $filename then then fi fi通常简写为通常简写为通常简写为通常简写为: if -f $filename : if -f $filename 用用方括号替方括号替代代test语句语句至少一至少一个空格个空格至少一至少一个空格个空格liudi:四四. 多路分支语句多路分支语句 caseesac 多路分支语句多路分支语句多路分支语句多路分支语句casecase用于多重条件测试用于多重条件测试用于多重条件测试用于多重条件测试, , 语法结构语法结构语法结构语法结构清晰自然清晰自然清晰自然清晰自然. . 其语法结

32、构为其语法结构为其语法结构为其语法结构为: : case case 字符串变量字符串变量字符串变量字符串变量 inin 模式模式模式模式1)1) 命令表命令表命令表命令表1 1 ; ; 模式模式模式模式2)2) 命令表命令表命令表命令表2 2 ; ; 模式模式模式模式n)n) 命令表命令表命令表命令表n n ; ; esacesaccase语句只能检测字符串变量语句只能检测字符串变量各各模式中可用文件名元字符模式中可用文件名元字符,以右括号结束以右括号结束命令表以单独的双分号行结束命令表以单独的双分号行结束,退出退出case语句语句模式模式 n常写为字符常写为字符* 表示所有其它模式表示所有其

33、它模式最后一个双分号行可以省略最后一个双分号行可以省略实例实例实例实例. . 程序程序程序程序prog4prog4检查用户输入的文件名检查用户输入的文件名检查用户输入的文件名检查用户输入的文件名, , 用法为用法为用法为用法为: : prog4 string_name prog4 string_name# The statement of case# The statement of caseesacesacif $# -if $# -eqeq 0 0 thenthenecho No argument is declaredecho No argument is declaredexitexi

34、tfi ficase $1 incase $1 infile1)file1)echo User selects file1echo User selects file1; ;file2)file2)echo User selects file2echo User selects file2; ;*)*)echo You must select either file1 or file2!echo You must select either file1 or file2!; ;esacesac五五. 循环语句循环语句 fordodone 当循环次数已知或确定时当循环次数已知或确定时当循环次数已

35、知或确定时当循环次数已知或确定时, , 使用使用使用使用forfor循环语句来多次执循环语句来多次执循环语句来多次执循环语句来多次执行行行行一条或一组命令一条或一组命令一条或一组命令一条或一组命令. . 循环体由语句括号循环体由语句括号循环体由语句括号循环体由语句括号dodo和和和和donedone来限定来限定来限定来限定. . 格格格格式式式式为为为为: for : for 变量名变量名变量名变量名 in in 单词表单词表单词表单词表 dodo 命令表命令表命令表命令表 donedone变量依次取单词表中的各个单词变量依次取单词表中的各个单词变量依次取单词表中的各个单词变量依次取单词表中的

36、各个单词, , 每取一次单词每取一次单词每取一次单词每取一次单词, , 就执行一就执行一就执行一就执行一次循环体中的命令次循环体中的命令次循环体中的命令次循环体中的命令. . 循环次数由单词表中的单词数确定循环次数由单词表中的单词数确定循环次数由单词表中的单词数确定循环次数由单词表中的单词数确定. . 命命命命令表中的命令可以是一条令表中的命令可以是一条令表中的命令可以是一条令表中的命令可以是一条, , 也可以是由分号或换行符分开的也可以是由分号或换行符分开的也可以是由分号或换行符分开的也可以是由分号或换行符分开的多条多条多条多条. . 如果单词表是命令行上的所有位置参数时如果单词表是命令行上

37、的所有位置参数时如果单词表是命令行上的所有位置参数时如果单词表是命令行上的所有位置参数时, , 可以在可以在可以在可以在forfor语句中省略语句中省略语句中省略语句中省略 in in 单词表单词表单词表单词表 部分部分部分部分. .实例实例实例实例. . 包含包含包含包含forfor语句的程序语句的程序语句的程序语句的程序prog5prog5拷贝当前目录下的所有文拷贝当前目录下的所有文拷贝当前目录下的所有文拷贝当前目录下的所有文件到件到件到件到backupbackup子目录下子目录下子目录下子目录下. . 使用语法及程序为使用语法及程序为使用语法及程序为使用语法及程序为: : prog5 f

38、ilename prog5 filename # The statement of fordodone# The statement of fordodoneIf ! -d $HOME/backup If ! -d $HOME/backup thenthenmkdirmkdir $HOME/backup $HOME/backupfi fiflistflist=ls ls for file in $for file in $flistflistdodoif $# = 1 if $# = 1 thenthenif $1 = $file if $1 = $file thenthenecho $fil

39、e found ; exitecho $file found ; exitfi fielseelsecp $file $HOME/backupcp $file $HOME/backupecho $file copiedecho $file copiedfi fidonedoneecho *Back up completed*echo *Back up completed*flist的值是的值是ls的执行结果即当前目录下的文件名的执行结果即当前目录下的文件名命令行上有一个参数时命令行上有一个参数时命令行上不带参数时命令行上不带参数时六六. 循环语句循环语句 whiledodone语法结构为:语法

40、结构为:语法结构为:语法结构为: while while 命令或表达式命令或表达式命令或表达式命令或表达式 dodo 命令表命令表命令表命令表 donedonewhilewhile语句首先测试其后的命令或表达式的值,如果为真,语句首先测试其后的命令或表达式的值,如果为真,语句首先测试其后的命令或表达式的值,如果为真,语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式就执行一次循环体中的命令,然后再测试该命令或表达式就执行一次循环体中的命令,然后再测试该命令或表达式就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式

41、为假时退出循环。的值,执行循环体,直到该命令或表达式为假时退出循环。的值,执行循环体,直到该命令或表达式为假时退出循环。的值,执行循环体,直到该命令或表达式为假时退出循环。 whilewhile语句的退出状态为命令表中被执行的最后一条命语句的退出状态为命令表中被执行的最后一条命语句的退出状态为命令表中被执行的最后一条命语句的退出状态为命令表中被执行的最后一条命令的退出状态。令的退出状态。令的退出状态。令的退出状态。实例实例. 创建文件程序创建文件程序创建文件程序创建文件程序prog6, prog6, 用法为用法为用法为用法为: : prog6 file numberprog6 file num

42、ber# The statement for while# The statement for whileif $# = 2 if $# = 2 thenthenloop=$2loop=$2elseelseloop=5loop=5fi fii=1i=1while $i -while $i -eqeq $loop $loop dodo$1$i$1$ii=i=exprexpr $i + 1 $i + 1donedone建立以建立以file开头开头, 变量变量i的值结的值结尾的空文件名尾的空文件名. 参见命令参见命令cmd file根据命令行参数的个根据命令行参数的个数确定循环的次数数确定循环的次数

43、七七. 循环语句循环语句 untildodone语法结构为语法结构为语法结构为语法结构为: until : until 命令或表达式命令或表达式命令或表达式命令或表达式 dodo 命令表命令表命令表命令表 donedoneuntiluntil循环与循环与循环与循环与whilewhile循环的功能相似循环的功能相似循环的功能相似循环的功能相似, , 所不同的是只所不同的是只所不同的是只所不同的是只有有有有当测试的命令或表达式的值是假时当测试的命令或表达式的值是假时当测试的命令或表达式的值是假时当测试的命令或表达式的值是假时, , 才执行循环体才执行循环体才执行循环体才执行循环体中的命令表中的命令

44、表中的命令表中的命令表, , 否则退出循环否则退出循环否则退出循环否则退出循环. . 这一点与这一点与这一点与这一点与whilewhile命令正命令正命令正命令正好相反好相反好相反好相反. .八八. 循环控制语句循环控制语句 break 和和 continue break break语句从包含该语句的最近一层循环中语句从包含该语句的最近一层循环中语句从包含该语句的最近一层循环中语句从包含该语句的最近一层循环中跳出跳出跳出跳出一层一层一层一层, break n , break n 则跳出则跳出则跳出则跳出n n层层层层; continue; continue语句则马上转语句则马上转语句则马上转语

45、句则马上转到最近一层循环语句的到最近一层循环语句的到最近一层循环语句的到最近一层循环语句的下一轮下一轮下一轮下一轮循环上循环上循环上循环上, continue n, continue n则转到最近则转到最近则转到最近则转到最近n n层循环语句的下一轮循环上层循环语句的下一轮循环上层循环语句的下一轮循环上层循环语句的下一轮循环上. .实例实例实例实例. . 程序程序程序程序prog7prog7的用法为的用法为的用法为的用法为: : prog7 prog7 整数整数整数整数 整数整数整数整数 整数整数整数整数 参数个数不确定参数个数不确定参数个数不确定参数个数不确定, , 范围为范围为范围为范围为

46、110110个个个个, , 每个参数都是正每个参数都是正每个参数都是正每个参数都是正整整整整数数数数. .if $# = 0 if $# = 0 thenthenecho Numeric arguments requiredecho Numeric arguments requiredexitexitfi fiif $# -if $# -gtgt 10 10 thenthenecho Only ten arguments allowedecho Only ten arguments allowedexitexitfi fifor numberfor numberdodocount=count=

47、exprexpr $number % 2 $number % 2if $count -if $count -eqeq 1 1 thenthencontinuecontinueelseelseoutput=$output $numberoutput=$output $numberfi fidonedoneecho Even numbers: $output echo Even numbers: $output 取取所有位置参数所有位置参数用用2求求模模, count的的值只能是值只能是0或或1下下轮轮循循环环是是奇数奇数偶数放到偶数队列中偶数放到偶数队列中实例实例实例实例. . 包含包含包含包含

48、whilewhile、untiluntil和和和和breakbreak语句的语句的语句的语句的prog8 prog8 程序程序程序程序. .while truewhile truedodoecho level1echo level1until falseuntil falsedodoecho level2echo level2while truewhile truedodoecho level3echo level3breakbreakdonedonedonedonedonedonewhilewhile语句后的表达式为语句后的表达式为语句后的表达式为语句后的表达式为true(true(真真真真

49、), until), until语句后的表达式为语句后的表达式为语句后的表达式为语句后的表达式为false(false(假假假假), ), 循环条件永远成立循环条件永远成立循环条件永远成立循环条件永远成立, , 因此是无限循环因此是无限循环因此是无限循环因此是无限循环. .死死循环程序循环程序, 只只能由人工中断能由人工中断如果改为如果改为break 3跳出最外层循环跳出最外层循环改为改为continue 3开始最外层循环开始最外层循环九九. shell 函数函数 在在在在shellshell程序中程序中程序中程序中, , 常常把完成固定功能、且多次使常常把完成固定功能、且多次使常常把完成固定

50、功能、且多次使常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要用的一组命令(语句)封装在一个函数里,每当要用的一组命令(语句)封装在一个函数里,每当要用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。使用该功能时只需调用该函数名即可。使用该功能时只需调用该函数名即可。使用该功能时只需调用该函数名即可。 函数在调用前必须先定义,即在顺序上函数说函数在调用前必须先定义,即在顺序上函数说函数在调用前必须先定义,即在顺序上函数说函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。明必须放在调用程序的前面。明必须放在调用程序的前面。明必须

51、放在调用程序的前面。 调用程序可传递参数给函数调用程序可传递参数给函数调用程序可传递参数给函数调用程序可传递参数给函数, , 函数可用函数可用函数可用函数可用returnreturn语语语语句把运行结果返回给调用程序句把运行结果返回给调用程序句把运行结果返回给调用程序句把运行结果返回给调用程序. . 函数只在当前函数只在当前函数只在当前函数只在当前shellshell中起作用中起作用中起作用中起作用, , 不能输出到子不能输出到子不能输出到子不能输出到子shellshell中中中中. .函数格式函数格式: function_name ( )function_name ( ) command1

52、command1 commandncommandn 函数调用格式函数调用格式函数调用格式函数调用格式: : value_name=function_name arg1 arg2 value_name=function_name arg1 arg2 或者或者或者或者: : function_name arg1 arg2 function_name arg1 arg2 echo $value_name echo $value_name函数的所有标准输出都传函数的所有标准输出都传递给了主程序的变量递给了主程序的变量函数的返回值隐含在变量中函数的返回值隐含在变量中, 由主程序使用该变量的值由主程序使用

53、该变量的值实例实例实例实例: :check_user( ) #check_user( ) #查找已登录的指定用户查找已登录的指定用户查找已登录的指定用户查找已登录的指定用户 user= user=psps e | e | grepgrep $1 $1 if -n $user if -n $user then then return 1 # return 1 #找到指定用户找到指定用户找到指定用户找到指定用户 elseelse return 0 # return 0 #未找到指定用户未找到指定用户未找到指定用户未找到指定用户 fi fi while true # MAIN, Main, main

54、: program begin herewhile true # MAIN, Main, main: program begin heredodoecho Input username: cecho Input username: cread read unameunamecheck_user check_user unameuname # # 调用函数调用函数调用函数调用函数, , 并传递参数并传递参数并传递参数并传递参数unameunameif $? if $? eqeq 1 # $? 1 # $?为函数返回值为函数返回值为函数返回值为函数返回值thenthenecho user $echo user $unameuname online onlineelseelseecho user $echo user $unameuname offline offlinefi fidonedone

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号