-1-实训五Linuxshell编程【实习目的】掌握Linuxshell的基本编程,包括:编程、调试与应用【实习指导】一、shell编程简介Linuxshell是一个命令解释器,用来接受并执行命令(包括运行批处理文件和执行程序)。shell环绕在内核的外层,它是Linux操作系统和用户之间的界面。当用户从shell或其他程序向Linux传递命令,内核会做出相应的反应。这里,将介绍Linux下最常用的shell——bash。bash(BourneAgainShell)是大多数Linux发行套件的缺省shell,并被大多数用户所使用。在命令行输入命令时,每次输入一个命令,就可得到系统的响应。但如果经常要依次执行同一组命令,就可以利用shell程序来实现。shell程序是放在一个文件中的一系列的Linux命令。执行shell程序时,由Linux逐条解释和执行每个命令。二、shell程序文件shell程序文件是一个特殊的文本文件,其内容包含一系列可在shell提示符下执行的命令,以及shell提供的专用的命令和控制语句。Linux提供的shell命令可通过命令help来获得,在shell提示符下,键入命令“help|more”,图5-1所示是获得所有shell命令的列表的一部分。图5-1如要获得其中命令echo的详细帮助信息,则在shell提示符下,键入命令“helpecho”,便获得该命令的详细使用信息如图5-2所示。-2-图5-2图中可观察到,该命令的功能是在屏幕上输出给定的信息。shell程序文件的运行过程是将shell程序文件中的命令依次执行。三、shell程序的建立shell程序文件可用任何一个文件编辑器(如vi)来建立。例如,建立shell程序shex1,存放在当前目录下(假定当前目录为/root),程序功能为先清屏,然后显示98年的1、2、3月份的月历。程序文件内容如下:clearcal198cal298cal398用vi编辑器建立shell程序文件shex1的方法如下:(1)键入命令“vishex1”,启动vi;(2)按命令“i”,进入vi的插入状态;(3)输入程序文件内容;(4)按Esc键,再键入“:”,切换到vi的命令状态;(5)最后键入命令“wq”,保存文件内容后,退出vi。至此,shell程序文件shex1已建立。四、shell程序的运行运行shell程序有两种方法:一种是在shell环境下,将shell程序文件作为子shell程序被调用执行;另一种是将shell程序文件视作命令来执行(因此,shell程序文件可以看作是将各种命令组合在一起而形成的新命令),此时必须赋予shell程序文件执行权限。方法一:shshell程序文件名[参数1参数2……]-3-方法二:shell程序文件名[参数1参数2……]【例如】分别用两种方法运行已建立的shell程序文件shex1。方法一:在shell提示符下,键入命令:“shshex1”。方法二:(1)首先,给shell程序文件shex1赋予可执行权限,则在shell提示符下,键入命令:“chmoda+xshex1”;(2)然后,在shell提示符下,键入命令“/root/shex1”便可执行该shex1程序,如同其他shell命令一样。两种方法的运行结果,如图5-3所示。图5-3运行命令中有[参数]和没有[参数]的情况分别称为带参数的运行命令和不带参数的运行命令。在shell程序中可使用的形参为$0、$1、$2、……$9,当程序运行时,参数1参数2……依次赋值给$1、$2、……,通常称运行命令中所带的参数为实参。$0是一个特殊的形参,其值规定为当前运行的shell程序命令本身。由于形参个数有限,当参数较多时,可通过命令shift来移动形参与实参的对应关系,执行一次shift后,$1、$2、……变为依次与参数2参数3……对应,再执行一次shift后,$1、$2、……变为依次与参数3参数4……对应,依此类推。通过下面的例子shell程序shex2,可观察参数的移动变化。shex2程序文件内容如下:echo$0$1$2shift-4-echo$0$1$2运行的命令所带参数及运行结果如图5-4所示。图5-4图中可观察到,$0的值始终是当前运行的shell程序命令本身,即/root/shex2。例如,将shex1程序用参数形式进行改写,程序功能保持不变,最后将程序保存为shex3,存放在当前目录下。shex3程序文件内容如下:clearcal$198cal$298cal$398运行的命令所带参数及运行结果分别如图5-5所示。图5-5当带参数的运行命令为“/root/shex3123”,则运行结果显示如图4-6所示。注意,当实参为空时,形参将被传递空值。-5-五、变量Linux的shell程序中允许使用各种类型的变量,主要有系统、内部和用户变量三种。系统变量也称环境变量,它与用户变量的区别在于它可将值传给shell运行的其他命令或shell程序使用,亦即系统变量是全局变量。内部变量是由系统提供,与环境变量不同,用户不能修改用户变量由用户定义的变量,是当前shell的局部变量,不能被shell运行的其他命令或shell程序使用,亦即用户在shell程序中定义的程序变量只在程序运行时有效,一旦退出,这些变量自动失效。通过shell提供的命令set,可以查看当前shell下定义的一系列变量及其值。例如,在shell提示符下,键入命令“set|more”,显示当前shell下定义的变量及其值如图5-6所示。图5-61、变量赋值格式:变量名=字符串功能:将等号右边的字符串赋给等号左边的变量,即右边的字符串为左边变量的值。说明,任何不含空格的字符串都可作变量名。若字符串中含有空格,则在字符串上加上引号。例如,要求定义一个用户变量name1,并给变量赋值为“MARY”,则在shell提示符下,键入命令“name1=MARY”。例如,要求定义一个用户变量name2并给变量赋值为“XWindow”,则在shell提示符下,键入命令“name2=XWindow”。-6-2、引用变量格式:$变量名功能:引用变量的值。例如,要求将变量name1的值赋给变量name2,则在shell提示符下,键入命令“name2=$name1”。例如,要求在屏幕上显示变量name1的值,则在shell提示符下,键入命令“echo$name1”。3、释放变量格式:unset变量名功能:释放一个现存的shell变量。例如,要求释放变量name1,则在shell提示符下,键入命令“unsetname1”。变量的定义、赋值及引用过程如图5-7所示。图5-7六、shell程序的控制流与其他高级语言一样,shell编程中也提供了条件与循环等控制结构,下面介绍bash提供的主要的程序控制结构语句。1、条件控制流(1)if-then-else结构if条件判断命令then命令集1else命令集2fi其中,条件判断命令通常是“test表达式”,当条件成立,则返回0;条件不成立,则返回一个非0值。执行过程说明:当条件判断命令返回0时,则执行then后的命令集1,然后执行fi后面的命令;否则执行else后的命令集2,然后执行fi后面的命令。在if-then-else结构中,允许在then和else后的命令集中包含if-then-else结构,即允许嵌套。需要强调的是其中if和fi必须配对出现。-7-(2)if-then-fi结构if条件判断命令then命令集fi执行过程说明:当条件判断命令返回0时,则执行then后的命令集,然后执行fi后面的命令,否则执行fi后面的命令。(3)case结构case变量in字符串1)命令集1;;字符串n)命令集n*)缺省命令esac其中,字符串中可含通配符。执行过程说明:程序将变量的值依次和字符串1、字符串2、……、字符串n进行比较,哪个匹配,则执行后面的命令集;若都不匹配,则执行缺省命令。说明,如果能同时匹配多个字符串,则只能执行第一个匹配字符串后的命令集。2、循环控制流(1)for-in结构for循环变量[in循环变量取值集]do命令集done其中,循环变量取值集中的值与值之间用空格分隔。执行过程说明:程序从循环变量取值集中依次取值,赋给循环变量,并执行一轮由do和done括起来的循环体中的命令集,直到循环变量取值集中的值取完,再执行done后面的命令。若“in循环变量取值集”缺省,则循环变量取值集为实参集。(2)while结构while条件判断命令do命令集done-8-执行过程说明:当条件判断命令返回0时,则执行一轮由do和done括起来的循环体中的命令集,直到条件判断命令返回一个非0值时,则不再执行循环体中的命令,执行done后面的命令。(3)until结构until条件判断命令do命令集done执行过程说明:与while结构相反,当条件判断命令返回非0时,执行循环体中的命令,直到条件判断命令返回一个0值时,,继续执行done后面的命令。3、条件判断命令test条件表达式是控制程序流程的关键,shell提供的test命令可组合多个表达式,生成功能灵活的条件表达式,使shell程序的功能更强,下面介绍test命令的基本使用。格式:test表达式功能:test命令返回表达式成立与否的状态值,如果表达式成立,则test返回真的状态值0,否则,test返回假的状态值,即一个非0值。test命令中的表达式常见的有以下几类:(1)文件特性类-e文件名:检查文件名存在否,若存在,返回真值;否则返回假值。-f文件名:检查文件名是否是普通文件,若是,返回真值;否则返回假值。-d文件名:检查文件名是否是目录,若是,返回真值;否则返回假值。-r文件名:检查文件名是否可读,若是,返回真值;否则返回假值。-w文件名:检查文件名是否可写,若是,返回真值;否则返回假值。-x文件名:检查文件名是否可执行,若是,返回真值;否则返回假值。-s文件名:检查文件名是否存在且文件长度大于零,若是,返回真值;否则返回假值。文件名1–nt文件名2:如果文件名1比文件名2新(根据文件最后修改时间判断),返回真值;否则返回假值。文件名1–ot文件名2:若文件名1比文件名2旧(根据文件最后修改时间判断),返回真值;否则返回假值。-9-文件名1–ef文件名2:如果文件名1和文件名2有相同的设备名和inode号,返回真值;否则返回假值。(2)字符串类-z字符串:如果字符串长度为零,返回真值;否则返回假值。-n字符串:如果字符串长度不为零,返回真值;否则返回假值。字符串1=字符串2:如果字符串1与字符串2相等,返回真值;否则返回假值。字符串1!=字符串2:如果字符串1与字符串2不相等,返回真值;否则返回假值。(3)与或表达式类!表达式:如果表达式为假,则返回真值;否则返回假值。表达式1–a表达式2:表达式1、表达式2进行与操作,若表达式1、表达式2均为真,则返回真值;否则返回为假值。表达式1–o表达式2:表达式1、表达式2进行或操作,若表达式1、表达式2均为假,则返回假值;否则返回真值。(4)数值表达式类数值表达式1–eq数值表达式2:如果数值表达式1等于数值表达式2,则返回真值;否则返回假值。数值表达式1–ne数值表达式2:如果数值表达式1不等于数值表达式2,则返回真值;否则返回假值。数值表达式1–lt数值表达式2:如果数值表达式1小于数值表达式2,则返回真值;否则返回