《第6章 Linux Shell编程.ppt》由会员分享,可在线阅读,更多相关《第6章 Linux Shell编程.ppt(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第第6章章 Shell编程编程n n内容提要内容提要n nSHELLSHELL概述概述n n创建和执行创建和执行SHELLSHELL脚本脚本n nSHELLSHELL特殊字符特殊字符n nSHELLSHELL变量变量n n正则表达式与算术表达式正则表达式与算术表达式n n控制结构控制结构n n其他命令其他命令n n函数函数n n调试调试SHELLSHELL脚本脚本4.shell概述概述n n4.1.1 shell特点n n(1)对已有命令进行适当组合,构成新的命令,而且组合方式很简单;n n(2)提供了文件名扩展字符使得用单一的字符串可以匹配多个文件名,n n(3)可以直接使用shell的内
2、置命令,而不需创建新的进程,;n n4)shell允许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理和数据传输;n n(5)结构化的程序模块,提供了顺序流程控制、分支流程控制、循环流程控制等;n n(6)shell提供了在后台(&)执行命令的能力;n n(7)shell提供了可配置的环境,允许用户创建和修改命令、命令提示符和其他的系统行为;n n(8)shell提供一个高级的命令语言,允许用户能创建从简单到复杂的程序。n n4.1.2 shell4.1.2 shell的主要版式本的主要版式本n n在在LinuxLinux系统中常见的系统中常见的shel
3、lshell版本有以下几种。版本有以下几种。n n(1 1)Bourne Bourne shell(shshell(sh):它是最初使用的:它是最初使用的shellshell,并且在每种上都可以使用。它在,并且在每种上都可以使用。它在shellshell编程方面相当优秀,但处理与用户的交互方面不如编程方面相当优秀,但处理与用户的交互方面不如其他几种其他几种shellshell。n n(2 2)C C shell(cshshell(csh):它最初由:它最初由Bill JoyBill Joy编写,它更多地编写,它更多地考虑了用户界面的友好性,支持如命令补齐等一些考虑了用户界面的友好性,支持如命令
4、补齐等一些Bourne shellBourne shell所不支持的特性,但其编程接口做得不所不支持的特性,但其编程接口做得不如如Bourne shellBourne shell。shellshell被很多程序员使用,因为被很多程序员使用,因为 shellshell的语法和语言的很相似,的语法和语言的很相似,shellshell也由此得也由此得名。名。n n(3 3)ornorn shell(kshshell(ksh):它集合了:它集合了C shellC shell和和Bourne shellBourne shell的优点,并且和的优点,并且和Bourne shellBourne shell完
5、全兼容。完全兼容。n n(4)Bourne Again shell(bash):bash是大多数Linux系统的默认shell。它是Bourne shell的扩展,并与Bourne shell完全向后兼容,而且在Bourne shell的基础上增加和增强了很多特性。n n(5)tcsh:它是 shell的一个扩展版本,与csh完全向后兼容,但它包含了更多使用户感觉方便的新特性,其最大的提高是在命令行编辑和历史浏览方面。它不仅和Bash shelll提示符兼容,而且还提供比Bash shell更多的提示符参数。n n(6)pdksh:它是一个专门为Linux系统编写的Korn shell(ksh
6、)的扩展版本。Ksh是一个商用shell,不能免费提供,而pdksh是免费的4.2 创建和执行创建和执行shell脚本脚本n n1.建立shell脚本n nshell脚本(shell script)是指使用用户环境shell提供的语句所编写的命令文件。shell脚本可以包含任意从键盘输入的Linux命令。n n建立shell脚本的步骤与建立普通文本文件的方式相同,利用文字编辑器(如vi)进行程序录入和编辑加工。例如建立一个名为ex1的shell脚本,可提示符后输入命令:n n$vi example1n n 例例4.1 4.1 显示当前的日期时间、执行路径、用户账号显示当前的日期时间、执行路径、
7、用户账号及所在的目录位置。及所在的目录位置。n n在命令行中输入:在命令行中输入:n n$vi example1$vi example1n n在在vi vi编辑器中输入下列内容:编辑器中输入下列内容:n n#!/bin/bash#!/bin/bashn n#This script is a test!#This script is a test!n necho n“Date and time is:”echo n“Date and time is:”n ndate date n necho n “The executable path is:”$PATHecho n “The executab
8、le path is:”$PATHn necho “Your name is:echo “Your name is:whoamiwhoami”n necho -n “Your current directory is:”echo -n “Your current directory is:”n npwdpwd n n#end#endn n2.2.执行执行shellshell脚本脚本n n执行执行shellshell脚本的方式基本上有下述三种:脚本的方式基本上有下述三种:n n(1 1)输入定向到)输入定向到shellshell脚本。脚本。n n其一般形式是:其一般形式是:n n$bash$ba
9、sh脚本名脚本名n n例如:例如:$bash example1$bash example1n n(2 2)以脚本名作为参数。其一般形式为:)以脚本名作为参数。其一般形式为:n n$bash$bash 脚本名脚本名 参数参数 n n例如,例如,$bash example1$bash example1n n如果以当前如果以当前shellshell执行一个执行一个shellshell脚本,则可以使用如下脚本,则可以使用如下简便形式:简便形式:n n$脚本名脚本名 参数参数 n n(3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。n n使用chmode命令修改文件的属性,然后再执行n
10、 n例如,$chmod a+x example1 n n$example14.3 shell特殊字符特殊字符n n4.3.1 引号n n在shell中引号分为三种:双引号、单引号和倒引号。n n1双引号n n由双引号括起来的字符,除$、倒引号()和反斜线()仍保留其特殊功能外,其余字符均作为普通字符对待。n n例1 双引号的作用。n nwuxylocalhost pro$cat example2n necho “current directory is pwd”n necho “home directory is$HOME”n necho“file*.?”n necho “directory$
11、HOME”n nwuxylocalhost pro$bash example2n ncurrent directory is /home/wuxy/pron nhome directory is /home/wuxyn nfile*.?n ndirectory /home/wuxyn n2.单引号n n由单引号括起来的字符都作为普通字符出现。n n例2:n n$str=echo“directory is$HOME”n n$echo$strn necho “directory is$HOME”n n注意:被单引号括进来的所有字符都照原样显示出来,特殊字符也失去原来的意义。n n3.倒引号n n倒
12、引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。n n例3.n nwuxylocalhost pro$echo current directory is pwdn ncurrent directory is /home/wuxy/pron n4.反斜线n n反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠()能够阻止shell把后面的字符解释为特殊字符。例4:n nwuxylocalhost pro$echo “Filename is N0$*”n nFilename is N0$*n n注意:在单
13、引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。n n4.3.2 输入输出重定向n n在Linux系统中,执行一个shell命令时通常会自动打开三个标准文件,即标准输入文件,标准输出文件和标准出错输出文件.n n在shell中,这三个文件都可以通过重定向符进行重新定向。n n1.输入重定向符n n输入重定向符“”的作用是把命令(或可执行程序)的标准输入重新定向到指定文件。n n输入重定向的一般形式:n n命令 文件名n n例子5:n nwuxylocalhost pro$score”的作用是把命令(或可执行程序)的标准输出重新定向到指定文件。这样,该命令的输出就不在屏幕上显示,
14、而是写入指定文件中。n n输出重定向一般形式:n n命令 文件名n n例:n nwuxylocalhost pro$who outfile n n作用:命令who的输出重新定向到outfile文件中,在屏幕上看不到who的执行结果。n n3.输出附加重定向符n n输出附加重定向符“”的作用是把命令(或可执行程序)的输出附加到指定文件的后面,而该文件原有内容不被破坏。n n输出附加重定向的一般形式是:n n命令文件名n n例例:n n wuxylocalhostwuxylocalhost pro$pro$psps a a outfileoutfilen n则把则把psps命令的输出附加到文件命令
15、的输出附加到文件outfileoutfile的结尾处。的结尾处。n n4.4.即时文件定向符即时文件定向符n n即时文件是由重新定向符即时文件是由重新定向符“”、一对标记符以及、一对标记符以及其中的若干输入符组成。它允许把其中的若干输入符组成。它允许把shellshell程序的输入程序的输入行重新定向到一个命令中。即时文件的形式是:行重新定向到一个命令中。即时文件的形式是:n n命令命令 参数参数 标记符标记符n n输入行输入行n nn n标记符标记符n n注意注意:使用较少使用较少n n4.3.3 注释和管道线n n1.注释n nshell脚本中以“#”开头的正文行表示注释.n n#!/bi
16、n/bashn n#This script is a test!n necho n“Date and time is:”n ndate n necho n “The executable path is:”$PATHn necho “Your name is:whoami”这是注释n n2.管道线n n在Linux系统中,管道线是由竖杠(|)隔开的若干个命令组成的序列。在管道线中,每个命令执行时都有一个独立的进程,前一个命令的输出正是下一命令的输入。n n例如:n nwuxylocalhost pro$ls -l|wc -ln n4.3.4 4.3.4 命令执行操作符命令执行操作符n n1.1
17、.顺序执行顺序执行n n每条命令或管道线可单独占一行,按其出现顺序依每条命令或管道线可单独占一行,按其出现顺序依次执行。例如:次执行。例如:n n wuxylocalhostwuxylocalhost pro$pwdpro$pwdn n wuxylocalhostwuxylocalhost pro$who|wc-lpro$who|wc-ln n wuxylocalhostwuxylocalhost pro$cdpro$cd ././usrusr/bin/binn n也可将这些命令在一行中输入,此时,各条命令之也可将这些命令在一行中输入,此时,各条命令之间应以分号(;)隔开,例如:间应以分号(;
18、)隔开,例如:n n wuxylocalhostwuxylocalhost pro$pwdpro$pwd;who|who|wcwc l l;cdcd /usrusr/bin/binn n在执行时,以分号隔开的各条命令从左到右依次执在执行时,以分号隔开的各条命令从左到右依次执行,即前面命令执行成功与否,并不影响其后命令行,即前面命令执行成功与否,并不影响其后命令的执行。它与上面写成多行的形式是等价的。的执行。它与上面写成多行的形式是等价的。n n2.逻辑与n n逻辑与操作符“&”可把两个命令联系在一起,其一般形式是:n n命令1&命令2n n其功能是,先执行命令1,如果执行成功,才执行命令2;否
19、则,若命令1执行不成功,则不执行命令2。n n例如:n nwuxylocalhost pro$cp example1 example11&rm example1n n用&可以把多个命令联系起来,格式如下:n n命令1&命令2&命令3&命令nn n3.逻辑或n n逻辑或操作符“|”可把两个命令联系起来,其一般形式是:n n命令1|命令2n n其功能是,先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。n n例如:n nwuxylocalhost pro$cat example11|pwdn n利用“|”可把多个命令联系起来,格式如下:n n命令1|命令2|命令3
20、|命令n4.4 shell变量变量n nSHELL支持各种类型的变量。主要有三种变量类型:用户变量、内部变量和环境变量。n n用户变量是在编写shell脚本时定义的。可以在shell程序内任意使用和修改它们。n n内部变量是由系统提供的。与环境变量不同,但用户不能修改它们。n n环境变量是系统环境的一部分,不必去定义它们,可以在shell程序中使用它们。还能在shell中加以修改。n n4.4.1 4.4.1 用户变量用户变量n n1.1.变量名变量名n n用户定义的变量是最普通的用户定义的变量是最普通的shellshell变量。变量名是以变量。变量名是以字母或下线符开头的字母、数字和下线符序
21、列,并字母或下线符开头的字母、数字和下线符序列,并且大小写字母意义不同且大小写字母意义不同 。n n2.2.变量赋值变量赋值n n给变量赋值的过程也是声明一个变量的过程。给变量赋值的过程也是声明一个变量的过程。n n变量的赋值很简单,其一般形式是:变量的赋值很简单,其一般形式是:n n变量名变量名=字符串字符串/数字数字n n例如:例如:n nlcountlcount=0=0n nmynamemyname=wangtongwangtongn n3.访问变量值n n可以通过给变量名加上前缀$(美元符)来访问变量的值。n n例如:n n如果要把myname的值分配给变量yourname,那么可以执
22、行下面的命令:n nyourname=$mynamen n4.4.2 内部变量n n内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。n n部分内部变量是:n n$#传送给shell程序的位置参数的数量n n$?最后命令的完成码或者在shell程序内部执行的shell程序(返回值)n n$0shell程序的名称n n$*调用shell程序时所传送的全部参数成的单字符串n n4.4.3 环境变量n nLinux环境(也称为shell环境)由许多变量及这些变量的值组成,由这些变量和变量的值决定环境外观。这些变量就是环境变量。n
23、 n主要环境变量的有:n n(1)HOME:用户目录的全路径名。n n(2)LOGNAME:即用户的注册名,由Linux自动设置。n n(3)MAIL:用户的系统信箱的路径。n n(4)PATH:shell从中查找命令的目录列表。n n(5)PS1:shell的主提示符。n n6)PWD:用户当前工作目录的路径。它指出用户目前在Linux文件系统中处在什么位置。它是由Linux自动设置的。n n(7)SHELL:用户当前使用的shell。它也指出你的shell解释程序放在什么地方。n n(8)TERM:用户终端类型。DEC公司制定的vt-100终端的特性,被许多厂商接受,也被许多终端软件仿真,
24、成为广泛使用的标准设置。n n4.4.4 位置参数n n1.位置参数及引用n n可以编写一个shell脚本,当从命令行或者从其他shell脚本中调用它的时候,这个脚本接收若干参数。这些选项是通过Linux作为位置参数(positional parameter)提供给shell程序的。在shell脚本中应有变量,接收实参,这类变量的名称很特别,分别是1,2,3,这类变量称为位置变量。位置参数1存放在位置变量1中,位置参数2存放位置变量2中,在程序中可以使用$1,$2,来访问,n n2.用set命令为位置参数赋值n n在shell程序中可以利用set命令为位置参数赋值或重新赋值。n n(1)一般格
25、式:n nset 参数表n n(2)说明:该命令后面无参数时,将显示系统中的系统变量的值;如果有参数将分别给位置参数赋值。n n3.位置参数移动n n当位置变量个数超出9个时,就不能直接引用位置大于9的位置变量了,必须用shift命令移动位置参数。n n(1)一般形式:n nshift nn n(2)说明:每次执行时,把位置参数向左移动n位。如果没有参数,每次执行时,把位置参数向左移动1位。4.5 正则表达式与算术运算正则表达式与算术运算n n4.5.1 正则表达式n n正则表达式是一种可以用于模式匹配和替换的工具,可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与待比较字符串或
26、文件进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。n n1.一般通配符n n通配符用于模式匹配,常用的通配符有6种。n n(1)*(星号),它匹配任意字符的0次或多次出现。n n(2)?(问号),它匹配任意一个字符。n n(3)(一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符。n n(4)!(惊叹号),如果它紧跟在一对方括号的左方括号之后,则表示不在一对方括号中所列出的字符。n n(5)(幂次方号),只允放在一行的开始匹配字符串。n n(6)$(美元号),只在行尾匹配字符串,它放在匹配单词的后面。n n2.模式表达式n n模式表达式是那些包含一个或多个通配
27、符的字符串。n n(1)*(模式表),匹配给定模式表中“模式”的0次或多次出现,各模式之间以“|”分开。例如,file*(.c|.o)匹配文件fle.c、file.o、file.c.o、file.c.c、file.o.c、file等,但不匹配file.h、file.s等。n n(2)+(模式表),匹配给定模式表中“模式”1次或多次出现,各模式之间以“|”分开。例如,file+(.c|.o)匹配文件file.c、file.o、file.o.c、file.c.o等,但不匹配file。n n(3)?(模式表),匹配模式表中任何一种“模式”的0次或1次出现,各模式之间以“|”分开。例如,file?(.
28、c|.o)只匹配file、file.c、file.o等,不匹配file.c.c、file.c.o等。n n(4)(模式表),仅匹配模式表中给定“模式”的一次出现,各模式之间以“|”分开。例如,file(.c|.o)只匹配file.c和file.o,但不匹配file、file.c.c、file.c.o等。n n(5)!(模式表),除给定模式表中的一个“模式”之外,它可以匹配其他任何字符串。n n4.5.2 算术运算n nbash中执行整数算术运算的命令是let,其语法格式为:n nlet 参数 n n其中参数是单独的算术表达式。n nlet命令的替代表示形式是:n n(算术表达式)4.6 控制结
29、构n n4.6.1 条件语句n n1条件测试n n在shell中,测试条件表达式中只能通过使用test命令来完成。test命令的语法如下:n ntest 条件表达式n n或者n n条件表达式n nTest有四类比较符:字符串比较、数字比较、文件操作符和逻辑操作符。n n(1)字符串比较n n下面的操作符可以用来比较两个字符串表达式:n ns1=s2:如果s1等于s2,则测试条件为真;n ns1!=s2:如果s1不等于s2,则测试条件为真;n n-n s1:如果字符串s1长度大于0,则测试条件为真;n n-z s1:如果字符串s1长度等于0,则测试条件为真;n n(2)数字比较n n下面的操作符
30、可以用来比较两个数:n nn1 eq n2:如果n1等于n2,则测试条件为真;n nn1 ne n2:如果n1不等于n2,则测试条件为真;n nn1 gt n2:如果n1大于n2,则测试条件为真;n nn1 ge n2:如果n1大于或等于n2,则测试条件为真;n nn1 lt n2:如果n1小于n2,则测试条件为真;n nn1 le n2:如果n1小于或者等于n2,则测试条件为真。n n(3 3)文件操作符)文件操作符n n下面的操作符可以用作文件比较操作符:下面的操作符可以用作文件比较操作符:n n-r -r 文件名文件名:如果文件存在且是用户可读的,则测试如果文件存在且是用户可读的,则测试
31、条件为真;条件为真;n n-w -w 文件名文件名:如果文件存在且是用户可写的,则测试如果文件存在且是用户可写的,则测试条件为真;条件为真;n n-x -x 文件名文件名:如果文件存在且是用户可执行的,则测如果文件存在且是用户可执行的,则测试条件为真;试条件为真;n n-d -d 文件名文件名:如果文件存在且是目录文件,则测试条如果文件存在且是目录文件,则测试条件为真;件为真;n n-f -f 文件名文件名:如果文件存在且是普通文件,则测试条如果文件存在且是普通文件,则测试条件为真;件为真;n n-b -b 文件名文件名:如果文件存在且是块文件,则测试条件如果文件存在且是块文件,则测试条件为真
32、;为真;n n-c -c 文件名文件名:如果文件存在且是字符文件,则测试条如果文件存在且是字符文件,则测试条件为真;件为真;n n-s -s 文件名文件名:如果文件存在且长度大于如果文件存在且长度大于0 0,则测试条件,则测试条件为真;为真;n n(4)逻辑操作符n n逻辑操作符用于根据逻辑规则比较表达式。下面这些字符表示NOT、AND和OR:n n!逻辑表达式:对一个逻辑表达式求反;n n逻辑表达式 a 逻辑表达式:如果两个逻辑表达式同时为真,则返回真;否则为假;n n逻辑表达式 o 逻辑表达式:如果两个逻辑表达式同进为假时,则返回假;否则为真。n n(5)特殊条件测试n n除以上条件测试外
33、,在if语句和循环语句中还常用下列三个特殊条件测试语句:n n:表示不做任何事情,其退出值为0;n ntrue 表示总为真,其退出值总为0;n nfalse 表示总为假,其退出值是255。n n2.条件语句n n(1)if语句n nif语句通过判定条件表达式来作出选择。if语句格式如下:n n格式1:n nif 条件表达式n nthenn n命令1n nelsen n 命令2n nfin n 格式2:n nif 条件表达式1n nthenn n 命令1n nelif 条件表达式2n nthenn n 命令2n nn nelsen n 命令nn nfin n执行过程:n n格式1的执行过程是,先
34、进行“条件测试”,如果测试结果为真,则执行then之后的“命令”;否则,执行else之后的“命令2”。n n格式2的执行过程是,先进行“条件1测试”,如果测试结果为真,则执行命令1;否则,进行“条件2测试”,如果测试结果为真,则执行命令2;,如果条件测试都为假,则执行命令n。n nif语句更一般格式是:n nif 命令表1n nthenn n命令表2n nelsen n 命令表3n nfin n例:例:if if语句应用,文件名为语句应用,文件名为exampl9exampl9。n n#!/bin/bash#!/bin/bashn n#if statement#if statement apli
35、cationaplicationn nif$1=”yes”if$1=”yes”n nthenthenn n echo“value is yes”echo“value is yes”n nelifelif$1=”no”$1=”no”n nthenthenn n echo“value is no”echo“value is no”n nelseelsen n echo“invalid value”echo“invalid value”n nfi fin n#end#endn n运行这个脚本:运行这个脚本:wuxylocalhostwuxylocalhost pro$bashpro$bash exa
36、mpl9 yes exampl9 yesn nvalue is yesvalue is yesn n(2 2)casecase语句语句n ncasecase语句用来执行依赖于离散值或者与指定变量相匹配的一语句用来执行依赖于离散值或者与指定变量相匹配的一定范围的数据的语句。定范围的数据的语句。n n cashcash语句的格式如下:语句的格式如下:n n case case 字符串字符串 in in n n 模式字符串模式字符串1 1)命令命令n n n n 命令;命令;n n 模式字符串模式字符串2 2)命令)命令n n n n 命令;命令;n n n n 模式字符串模式字符串n)n)命令命令
37、n n n n 命令;命令;n n *)命令命令n n esacesacn n其执行过程是,用“字符串”的值依次与各模式字符串进行比较,如果发现同某一个匹配,那么就执行该模式字符串之后的各个命令,直至遇到两个分号为止。如果没有任何模式字符串与该字符串的值相符合,则执行*后面的命令。n n例:以月份数字作为参数,编写一个回显月份名的脚本,脚本文件名为:exampl11。n n这个脚本如下所示:n n#!/bin/bashn ncase$1 inn n1)echo“month is January”;n n2)echo“month is February”;n n3)echo“month is M
38、arch”;n n4)echo“month is April”;n n5)echo“month is May”;n n6)echo“month is June”;n n7)echo“month is July”;n n8)echo“month is August”;n n9)echo“month is September”;n n10)echo“month is October”;n n11)echo“month is November”;n n12)echo“month is December”;n n*)echo “Invalid parameter.”;n nesacn n#endn n
39、运行脚本:n nwuxylocalhost pro$bash exampl11 2n nmonth is Februaryn n4.6.2 4.6.2 循环语句循环语句n nshellshell中有三种用于循环语句,即中有三种用于循环语句,即whilewhile语句、语句、forfor语句语句和和untiluntil语句。语句。n n1.while1.while语句语句n nwhilewhile语句的一般格形式是:语句的一般格形式是:n nwhile while 测试条件测试条件n ndo do n n 命令表命令表2 2n nDoneDonen n其执行过程是,先进行条件测试,如果结果为真,
40、其执行过程是,先进行条件测试,如果结果为真,则进入循环体(则进入循环体(do donedo done之间部分),执行其中命之间部分),执行其中命令;然后再做条件测试令;然后再做条件测试直至测试条件为假时才直至测试条件为假时才终止终止whilewhile语句的执行。语句的执行。n n例:while语句应用。n n#!/bin/bashn nwhile$1 n n do n n if -f$1 n n then echo “display :$1”n n cat$1n n else echo “$1 is not a file name.”n n fin n shiftn ndonen n2.fo
41、r2.for语句语句n nforfor语句是最常用的建立循环结构的语句。其使用格语句是最常用的建立循环结构的语句。其使用格式主要有三种,取决于循环变量的取值方式。式主要有三种,取决于循环变量的取值方式。n n(1 1)第一种格式如下:)第一种格式如下:n nfor for 变量变量 in in 值表值表n ndodon n 命令表命令表n ndonedonen n其执行过程是,变量依次取值表中各个值,即第一其执行过程是,变量依次取值表中各个值,即第一次取值表中第一个值,然后进入循环体,执行其中次取值表中第一个值,然后进入循环体,执行其中的命令;第二次取值表中第二个值,然后进入循环的命令;第二次
42、取值表中第二个值,然后进入循环体,执行其中的命令;依次处理,直到变量把值表体,执行其中的命令;依次处理,直到变量把值表中各个值都取一次之后,从而结束中各个值都取一次之后,从而结束forfor循环。循环。n n例:for语句第一种格式的应用举例n n#!/bin/bashn nfor day in Monday Wednesday Friday Sundayn ndo n necho$dayn ndonen n#endn n(2)第二种格式如下:n nfor 变量 in 文件正则表达式n ndo n n命令表n ndonen n其执行过程是,变量的值依次取取当前目录下(或给定目录下)与正则表达式
43、相匹配的文件名,每取一次,就进入循环命令表,直到所有匹配的文件名取完为止,退出循环。n nfor语句第二格式应用举例n n#!/bin/bashn nfor file in m*.cn ndo n n n ncat$file|prn ndonen n#endn n(3)第三种格式如下:n nfor i in$*或者 for in ndo do n n 命令表 命令表n ndone donen n其执行过程是,变量i依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。n n 例Lfor语句第三种格式的应用举例n n#/bin/bashn n#display files und
44、er a given directoryn n#$1the name of the directoryn n#$2the name of filesn ndir=$1;shiftn nif -d$dir n nthen n ncd$dir n nfor filename n ndon nif -f$filename n nthen cat$filenamen necho “End of$dir/$filenamen nelse echo “Invalid file name:$dir/$filenamen nfin ndonen nelse echo “Bad directory name:$
45、dir.”n nfin n#endn n3.until语句n nuntil语句可以用来执行一系列命令直到所指定的条件为真时才终止循环。n nuntil语句的一般格式如下:n nuntil 测试条件n ndon n 命令表n nDonen n可以看出,它与while语句很相似,只是测试条件不同,即当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。4.7 其他语句其他语句n n4.7.1 break语句n nbreak语句可以用来终止一个重复执行的循环。这种循环可以是for、until或者repeat语句构成的循环。其语法格式是:n nbreak nn n其中n表示要跳出的几层循环。n
46、n4.7.2 continue语句n ncontinue语句跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。n ncontinue nn n其中,n表示从包含continue语句的最内层循环体向外跳到第几层循环。默认值为1。循环层数是由内向外编号。n n4.7.3 exit语句n nexit语句可以用来退出一个shell程序,并设置退出值。其语法格式是:n nexit nn n其中n是设定的退出值。4.8 函数函数n n函数是shell程序中执行特殊过程的部件,并且在shell程序中可以被重复调用。n n函数定义格式为:n nfunction函数名()n nn n 命令表n n
47、n n其中,关键字function可以默认。n n函数的调用形式为:n n函数名 参数1 参数2 参数3n n参数是可选的。n n例:函数应用举例。displaymonth函数作用是:在你传送一个月份数字之后显示月份名或者一条错误消息。n n#!/bin/bashn ndisplaymonth()n ncase$1 inn n1)echo“month is January”;n n2)echo“month is February”;n n3)echo“month is March”;n n4)echo“month is April”;n n5)echo“month is May”;n n6)e
48、cho“month is June”;n n7)echo“month is July”;n n8)echo“month is August”;n n9)echo“month is September”;n n10)echo“month is October”;n n11)echo“month is November”;n n12)echo“month is December”;n n*)echo“Invalid parameter”;n nesacn nn nwhile truen ndo n necho “input months number;”n nread mmn ndisplaymo
49、nth$mmn necho “continue(y/n)?”n nread answern nif$answer=n n nthen breakn nfin n donen n#end4.9 调试调试shell脚本脚本n n在bash中,shell脚本的调试主要是利用bash命令解释程序的选项来实现的。格式为:n nbash 选项 脚本文件名n n其中,主要利用bash命令解释程序的“v”或“x”选项来跟踪程序的执行。例如:n n$binbash -x 脚本文件名n n或$binbash -v 脚本文件名n n通常,“-v”选项允许用户观察一个shell.程序的读入和执行,如果在读入命令行时发生错误,则终止程序的执行。n n而“-x”选项,也允许用户观察一个shell程序的执行,而它是在命令行执行前完成所有替换之后,显示出每一个被替换后的命令行,并且在行前加前缀符号“”(变量赋值语句不加“”符号),然后执行命令。n n两者的主要区别在于:使用“-v”选项,则打印出命令行的原始内容;而使用“-x”选项,则打印出经过替换后的命令行的内容。