您好,欢迎访问三七文档
主流网络操作系统第1章shell程序设计shell是UNIX系统中一个重要的层次,它是用户与系统交互作用的界面。在以上介绍UNIX命令时,shell都作为命令解释程序出现:它接受用户键入的命令,进行分析,创建子进程,有子进程实现命令所规定的功能,等子进程终止工作后,发出提示符。这是shell最常用的使用方式。UNIXshell除了作为命令解释程序以外,还是一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if、case、while、for等语句,有自己的语法结构。利用shell程序设计语言可编写除功能很强、但代码简单的程序,特别是它把相关的UNIX命令有机地组合在一起,可大大提高编程的效率,充分利用UNIX系统的开放性能,设计出适合自己要求的命令。本章主要介绍shell(Bourneshell)的语法结构、各种变量定义及赋值引用、各种标点符号、控制语句等。1.1shell概述1.1.1shell的特点和主要版本UNIX系统中为用户提供了shell高级程序设计语言,大大方便了管理人员对系统的维护和普通用户的应用开发,提高了编程效率。Shell具有如下突出特点:1.把已有命令进行适当组合,构成新的命令;而组合方式很简单.2.可以进行交互式处理,用户和UNIX系统之间通过shell进行交互式会话,实现通讯。3.灵活地利用位置参数传递参数值。4.结构化的程序模块,提供了顺序流程控制、条件控制、循环控制等。5.提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理和数据传输。6.便于用户开发新的命令,利用shell过程可把用户编写的可执行程序与UNIX命令结合在一起,当作新的命令使用。7.提供后台处理方式,不用打断前台工作。在UNIX系统中通常提供三种不同的shell,即Bourneshell(简称sh)、C-shell(简称csh)和Kornshell(简称ksh)。Bourneshell是其它shell的开发基础,也是各种UNIX系统上最常用、最基本的shell。C-shell与sh不同,主要模仿C语言。Ksh与sh兼容,但功能根强大。在linux系统中使用Bash(BourneAgainshell),它是由Bourneshell发展而来。Bash与sh稍有不同,它还包含csh、ksh的特色,但大多数sh脚本可以不加修改地在Bash上运行。本章主要介绍sh,掌握了它,就很容易学习其它shell了。1.1.2shell程序示例使用shell最简单的方法是从键盘直接键入命令行。例如:$ls–l/usr/testshell命令解释程序对键入的命令进行分析、并创建子进程,完成该命令所对应的功能。Shell程序也可存放在文件上,通常称为shell脚本(script)下面是shell程序示例。[例]由三条简单命令组成的shell程序(文件名exl)date主流网络操作系统pwdcd..pwd执行这个shell程序时,依次执行其中各条命令:先显示出日期,接着显示当前工作目录,然后把工作目录改到当前目录的父目录,最后再显示此时目录。1.1.3shell脚本的建立和执行shell程序可以存放在文件中,这种被shell解释执行的命令文件称为shell脚本,也称作shell文件。Shell脚本可以包含任意从键盘键入的UNIX命令。建立shell脚本的步骤同建立普通文本文件的方式相同,利用vi编辑器进行程序录入和编辑加工。例如,要建立一个名为exl的shell脚本,可在提示符后键入命令:$viexl进入vi的插入方式后,就可录入你的程序行。完成编辑之后,将编辑缓冲区内容写入文件中,返回到shell命令状态。执行shell脚本的方式基本上有三种:1.输入定向到shell这种方式是用输入重定向方式让shell从给定文件中读入命令行并进行相应处理。其一般形式是:$sh脚本名例如:$shexlshell从文件exl中读取命令行,并执行它们。当shell到达文件末尾时,就终止执行返回到shell命令状态。2.以脚本名作为shell参数其一般形式为:$sh脚本名[参数]例如:$shex2/usr/test其执行结果与上一种方式一样。这种方式的好处是能将参数值传递给程序中的命令,从而使一个shell脚本可以处理多种情况,就如同函数调用时可根据具体问题给定相应的实参。如果以目前shell(以.表示)执行一个shell脚本,则可以使用如下简便形式:$.脚本名[参数]3.将shell脚本改为有执行权限有vi建立的shell脚本通常对用户是没有设定执行权限的,需要利用命令chmod将它改为有执行权限。例如:$chmoda+xex2就把shell脚本ex2改成对所有用户都有执行权限。然后在提示符后键入脚本名就可直接解释执行该文件(要求环境变量PATH的值中包含该脚本所在的目录)。例如:$ex2shell接受用户键入的命令(脚本名),并进行分析。如果文件被标记有执行权限,但不是被编译过的程序,就认为它是一个shell脚本。Shell将读取其中的内容,并加以解释执行。因此从用户的观点看,执行shell脚本的方式与执行一般的可执行文件的方式相同。故用户开发的shell可以驻留在命令搜索路径的目录之下,向普通命令一样进行使用自己开发的新命令。如果打算反复使用编好的shell脚本,那么采用这种方式就比较方便。在下面程序示例中都采用这种方式——预先将shell脚本置为有执行权限,所以shell脚本名可以直接当作命令名使用。Shell脚本经常被用来执行重复性的工作,例如,每当进入系统时都要查看日志,列出谁在系统中,将工作目录改到指定目录并予以显示,印出当前日期等。完成这些工作的命令是固定的。为了减少录入时间,可把这些命令建立在一个shell脚本中,以后每次使用该文件名就可执行这些工作。主流网络操作系统另外完成某些固定工作时需键入的命令很复杂,此时利用命令建立一个shell脚本,以后每次使用该脚本就可执行这些工作。1.2shell变量shell程序中也采用变量,用来存放字符串。Shell变量比C语言中的变量简单得多,没有众多存储类及类型的限制,也不需要预先定义、然后才能赋值,可以在使用时“现定义、现赋值”。Shell有两种变量:环境变量和临时变量。环境变量是永久性变量,其值不会随shell脚本执行结束而消失。而临时变量是在shell程序内部定义的,其使用范围仅限于定义它的程序,出了本程序就不能再用它;而且当程序执行完毕,它的值就不存在了。在shell脚本中临时变量又分为两类:用户定义的变量和位置参数。下面分别予以介绍。1.2.1用户定义的变量用户定义的变量是最普通的shell变量,变量名是以字母或下划线打头的字母、数字和下划线序列,并且大小写字母意义不同。这与C语言中标识符的定义相同。变量名的长度不受限制。定义变量并赋值的一般形式是:变量名=字符串例如:myfile=/usr/test/exl其中,myfile是变量名,=是赋值号,字符串/usr/test/exl是赋予myfile的值.注意,在赋值语句中,赋值号的两边没有空格,否则在执行时会引起错误。变量的值可以改变,只须利用赋值语句重新给它赋值即可。例如:myfile=/home/li/ex2此时变量myfile的值就是/home/li/ex2。在程序使用变量的值时,要在变量名前加上一个符号“$”。这个符号告诉shell,要取其后变量的值。[例]用echo命令显示变量值$dir=/usr/test/exl$echo$dir/usr/test/exl——显示结果$echodirdir——显示结果$可以看出,echo$dir执行时,将变量dir的值显示出来;而命令echodir执行时,因dir之前没有符号$,故认为dir不是变量,而只是一般的字符串常量。如果在赋值语句中赋值号右边没有给出字符串,例如:abc=那么变量abc的值为空字符串,即不包含任何字符。另外,一个未明确赋过值的变量也仅包含一个空字符串。[例]显示不同变量的值。$today=Sunday$echo$today$TodaySunday——显示结果$变量today与Today是不同的变量,前者显式赋过值。所以在执行echo命令时,把today的主流网络操作系统值显示出来,而Today的值等于空串。如果在赋给变量的值中要含有空格、制表符或换行符,那么就应该用双引号把这个字符串括起来。例如:name=“Zhanglicheng”以后引用$name时就是所赋予的整个字符串。如果没有用双引号括起来,那么name的值就是Zhang。在一个赋值语句中可以出现多个赋值,变量赋值可以迭代进行。但必须注意,各赋值工作是从右向左实现的。例如:A=$BB=$CC=good将使变量A和B的值均为字符串good。变量值可以作为某个长字符串中的一部分。如果它在长字符串的末尾,就可以利用直接引用形式。例如:$s=ing$echoread$sandwrit$sreadinganwriteing——显示结果如果变量值须出现在长字符串的开头或者中间,为了使变量名与其后的字符区分开,避免shell把它与其它字符混在一起视为一个新变量,则应该用花括号将该变量括起来。例如:$dir=/usr/meng$cat${dir}qc/m1.c将把文件/usr/mengqc/m1.c显示出来。如果引用dir的值时不用{}把dir括起来,系统会给出错误信息,因为它认为dirqc是一个变量,前面未显示赋值,所以其值为空串,无法找到m1.c文件。从这个示例也可以看出,利用shell变量可为长字符串提供简写形式。例如:$dir1=/usr/meng/ff/prog$ls$dirl$cat$dir1/m1.c用户定义的变量值还可利用read命令读入,或取某个命令的结果(见4.3.2节)或按条件进行参数置换(见4.4节)。1.2.2输入/输出命令1.read命令可以利用read命令由标准输入读取数据,然后赋给指定的变量。其一般格式是:read变量1[变量2…]例如:readnamereadabc利用read命令可交互式地为变量赋值。键入数据时,数据间以空格或制表符作为分隔符。若变量个数与给定数据个数相同,则依次对应赋值;若变量数少于数据个数,例如,执行$readn1n2时,用户输入:firstsecondthird则将first赋予n1,将secondthird(即当前字符至换行符之间的所有字符)赋予n2。若变量个数多于给定数据个数,例如,$readn1n2n3,用户输入:12,则n1取值1,n2取值2,而没有输入值与之对应的变量n3取空串。[例]$readn1firstsecondthird主流网络操作系统$echo$n1firstsecondthird$readn1n2n3onetwothreefourfive$echo$n3threefourfive还可利用read命令从给定文件描述字的文件中读取数据。其格式为:read变量&n其中,n为文件描述字。[例]$readname&32.echo命令在前面例子中已使用过echo命令,它将其后的参数在标准输出上输出。各参数间以空格隔开,以换行符终止。如果数据间需保留多个空格,通常最好用双引号把所有参数括起来,以便shell对它们正确解释。Echo的参数中可以有一些特殊字符,用于输出控制或印出无法显示的字符。\c——它出现在参数的最后位置,在它之前的参数被显示后,光标不换行,新的输出信息接在该行的后面。例如:$echo“Enterthefilename-\c”执行后,光标停在-后:Enterthefilename--\f——换页\n——显示换行\r——回车\t——制表符\\——印出反斜线本身1.2.3位置参数执行shell脚本时可以使用参数。由出现在命令上的位置确定的参数称作位置参数。在sh中总共有十个位置参数,其对应的名称依次是$0,$1,$2,…,$9。其中$0始终表示命令名或shell脚本名,对于一个命令行,必然有命令名,也就必定有$0;而
本文标题:Linux技术教程
链接地址:https://www.777doc.com/doc-2880942 .html