您好,欢迎访问三七文档
SHELL教程1SHELL教程青岛中天公司系统集成部2004年SHELL教程2Shell教程□前言对于一些例行的重复性工作,我们总希望能由机器自动完成。如果你使用的是Unix操作系统,那么编写一个小Shell程序是个聪明的办法,可以让你轻松地完成任务。Shell程序在功能上和一般的高级语言不相上下,使用起来相对灵活,功能强大。但不用担心,在你看完这本教程之后,你会发现编写一个Shell程序并不是件很难的事情。□Shell概念Shell是Unix操作系统提供的命令解释器或者说是一种命令语言,是用户与操作系统之间的接口。当你注册到Unix系统的任何一个用户,系统都会为你启动一个Shell,Shell会一直等待你的指令,当你输入的命令被确认后,Shell便对其进行解释并产生系统调用,完成相应操作,然后,又进入等待状态。换句话说,当你一登录到Unix系统,就开始了与Shell的对话。在此工作期间,你不断地与Shell交互,不断地对Shell发出命令来指挥系统完成各种工作(进入文本编辑器时除外)直到你退出系统。事实上Unix提供了三种Shell,分别是BourneShell、C-Shell和KornShell。这三种Shell大体相同,只在某些地方有所区别。其中BourneShell在各种不同的Unix版本中都是一致的,所以也叫做标准Shell,或者简称Shell。而其它几种Shell不能简称,必须全称,这是为了不必要的混淆。对于每一个用户来讲,执行一个程序只能选择其中一种Shell,一般是BourneShell。当然也可以使用其它Shell,这需要在建立用户的时候指明,或在具体执行某一个程序时特殊指定你所选择的命令解释器。下面将要介绍的内容如非特别声明都是针对BourneShell的。Shell作为命令型的编程语言,有不同于其它高级语言之处,它不支持复杂的结构,但有非常灵活的使用方式和便捷的手段。通过它,你将能打开Unix的强大功能之门,进入浩瀚的应用空间!□Shell的特点和优点1)输入/输出的重定向可以很轻易的改变输入输出的来源和目的地。2)连接管道可将一个命令的输出作为另一命令的输入。3)可以将Shell命令键入一个文件,通过执行这个文件来达到执行若干命令的目的。4)在不中断前台操作的情况下,可通过后台方式运行其它命令。5)可以把系统命令、Shell命令进行适当的组合,构成一个新命令。6)可以执行多种命令,包括Shell内部命令,Unix系统命令,编译好的可执行文件甚至Shell传递的位置参数。SHELL教程3□Shell程序一、概念如果你要重复执行一个或少数几个命令,在命令行上输入就足够了,但如果要执行的命令有十几个或几十个,恐怕就会很麻烦。但你可以将这些命令放到一个文件中,通过文件名来执行这些命令(就象DOS中的批处理)。在Unix系统中,不但可以完成这种操作,还可以象高级语言一样,完成更复杂的操作。把在命令行上可以执行的命令,以文本的形式存放到一个文件中,这就是一个Shell程序。它以行为单位,执行时会被自动地一行一行的执行。程序名就是存放这些命令的文件名。或者说,一个Shell程序就是一个文本文件,该文件中存放了一系列(若干行)Shell可识别的Unix命令。二、执行一个Shell程序编辑完成以后,如果要执行,只需在命令行上敲入:sh文件名并回车就行了。如:#shmyprogramENTER另外还有其它几种执行Shell程序的方法,建议你在阅读完本教程以后再去了解。它们放在附录1中。三、一个简单的Shell程序大家都知道#pwd回车后会产生的效果,也知道再执行cal命令后是什么样,但当这两个命令被放到一个文件中(假设文件名为test),然后在命令行通过敲入shtest并回车后,又会是什么结果呢?按照上面说的去做:首先在命令行提示符“#”后面用vi编辑器编辑一个叫test的文件:#vitest回车并在文件中写入下面两个命令:pwdcal最后存盘退出:x这时,在命令行“#”号后面敲入shtest并回车,其结果为:先显示出当前路径,然后再显示日历。这就是一个Shell程序,当然是一个非常简单的Shell程序,它只有两行:一行是pwd,另一行是cal。SHELL教程4□Shell基础知识二、特殊符号在Shell中有一些符号具有特殊的含义,可以用来实现某些功能,现分述如下:星号(*):可以匹配任何字符串,包括空串。如:echo*命令将显示当前目录下所有的文件和目录名,lfaa*显示所有以aa开头的文件或目录名。使用*做匹配符时,应特别小心,如rm*将删除目录下所有文件。问号(?):除了以“.”开头的文件名外,?可以匹配文件名中的任何单个字符。如用lfa??d命令来显示当前目录下的文件时,其结果可能为:abcd,aacd,aaad,中括号([]):可以匹配一个集合的元素。如果[crf]作为一个文件名模式的一部分,Shell将可以查找到指定位置的字母为c、r或f的文件名。例如:lf[crf]at命令的结果可能为:cat,fat,rat。中括号也能用于指定一个字符域,无论是数字还是字母。如:lfchapter[1-9]其结果将是可能存在的chapter1,chapter2等文件名。后台执行符号(&):如果一个程序运行的时间很长,并且不是一个交互式程序的话,就可以用“&”号使程序以后台的形式执行。其格式为:command&。以后台形式执行一个命令,不论命令需要执行多久,系统都会在给出一个进程号后,即刻返回到“#”号提示符下,使你不必等待上一个命令结束就可以运行其它命令。分号(;):分号可以让你在一个命令行或程序的一行中执行多个命令,只要在若干个命令之间以“;”号分隔开即可。如:#cd;pwd反斜杠(\):用于取消特殊字符的特殊含义。如:lfaa\*命令将查找当前目录是否有名为“aa*”的文件,与lfaa*命令有截然不同的含义。此外,如果在程序中某一行尚未完成,可以在行尾加上\号,使下一行的内容接到这一行的后面,成为同一行,如下echo“Themessageistoolongsowehave\tosplititintoseverallines”单引号(‘’):取消除单引号以外的任何字符的特殊含义。如:echo‘mynameis$name’其结果为:mynameis$name,此时$只作为一个普通字符使用,否则$name将被解释为变量name的值。双引号(“”):取消除双引号、$号以及_号以外的所有字符的特殊含义。输入转向符(〈):用于指定输入的设备或文件。如:mailroot〈message则将文件message的内容发送给root。SHELL教程5输出转向符(〉):用于将输出发送到指定的设备或文件。如:lf〉myfile其结果是将lf的执行结果放到文件myfile中(同时清空文件中原有的数据),而不显示到屏幕上。追加符号(〉〉):用于将命令的输出追加到某个文件中。如:lf〉〉myfile其结果是将lf的执行结果追加到文件myfile中(文件中原有的数据予以保留),而不显示到屏幕上。管道符号(|):可以将一个命令的输出作为另一个命令的输入,而不需要建立临时文件。以这样方式建立的多命令行称为管道线。如:ls/bin|more将ls/bin执行的结果传递给more,由more来分屏显示。改向符号(〈〈):常用于建立一个here文件。&&和||:其作用是使管道线有条件地执行。其使用方法为:command1&&command2:当且仅当command1执行成功后才执行command2command1||command2:当且仅当command1执行失败后才执行command2二、变量Shell的变量不分类型,或者说只有字符串型变量,所以要使用数值运算则必须靠外部命令达到目的。而其变量种类有下列几种:1.用户自定义变量在Shell程序中,这是最常使用的变量,在使用前不需要事先说明,没有类型之分,也没有全程、局部的区别。变量可以随时随地定义,其名称是以字母开头的不包含空格的任何字符串,长度不限。其使用范围只限于程序运行期间,程序执行完毕,该变量即不复存在。在此期间可以随时引用.定义变量用如下格式:变量名=字符串例如:name=Tom其中name为变量,被赋予字符串值“Tom”注意,字符串可以是空串,表示变量被赋予空值。引用一个变量时,在变量前加一$号即可。如:name=Tom#变量name被赋予字符串值“Tom”echo$name#显示变量name的值执行结果为:Tom一个未经定义的变量,其值为空。如:today=Monday#变量today被赋予字符串值”Monday”.echo$today$yesday#显示变量today、yesday的值运行后将显示:Monday因变量yesday未定义,显示为空.SHELL教程62.系统变量(环境变量)和自定义变量相似,系统变量只不过是在注册到用户中的时候,由系统自动赋值的,并且它的值会被自动传递到各层Shell并能够被该用户所执行的程序所调用。除非在程序中对环境变量进行修改,否则其值不会随Shell程序的运行而改变。要将一个用户自定义变量设定为环境变量,只需用”export”命令声明即可,如:name=Tomexportname以下是用戸一进入系统之后就已设定好的环境变量:$HOME在系统中用户自己的目录$PATH执行命令时所搜寻的目录$TZ时区$MAILCHECK每隔多少秒检查是否有新的信件$PS1命令行上的提示符$PS2当命令尚未打完时,Shell要求继续输入时的提示符$MANPATHman指令的搜寻路径3.只读的用户变量和用户变量相似,只不过这些变量的值不能被改变。要将用户变量设成只读的,只需在变量前加上”readonly”即可,如:readonlyNAME而若只打readonly则会列出所有只读的变量。还有一点,系统变量不可以设定成只读变量。name=Tomecho$namereadonlynamereadonlyname=John其执行结果如下:Tom#显示出变量name的值Tomreadonlyname#显示只读变量有namename:isreadonly#提示变量name为只读的,不允许被赋值SHELL教程74.特殊变量有些变量是一开始执行Shell程序时就被自动设定的,一般不能进行修改,但我们不叫它只读的系统变量,而叫它特殊变量(有些书会叫它只读的系统变量),因为这些变量是一执行程序时就有了,况且用户无法将一般的系统变量设定成只读的。以下是一些特殊变量:$0Shell程序的执行名$nShell程序(或过程)的第n个位置参数值,n=1..9$*Shell程序所有的位置参数组成的字符串$#Shell程序的位置参数个数$$程序被执行后的PID(该程序运行副本的进程号)常用来建立一个临时文件$!最后一个后台指令(程序)执行后的PID$?命令执行后的返回值。返回0表示正确执行,返回非0表示执行失败其中,$n又叫位置变量,它是调用(运行)一个Shell程序时,跟在程序名后面的各个参数,最多可有10个,它在程序内部的名称分别是0,1,2,......9。如:用以下方式运行程序:#shmyprogram1520则在程序中$1等于15,$2等于20,a=$1就使变量a被赋上值15.当你执行这个Shell程序时的参数数目超过9个时,可以使用Shift命令将参数往前移一格,如此便可以使用第10个甚至以后的参数。除此之外,还可以用set命令改变$n及$*的值,如在程序中有:setstudentgao24执行后$*的值即为”studentgao24”,而分解后则会分别放入$n。即$1,$2,$3的值分别为student,gao,24.而$4至$9的值为空。如果set命令后面没有参数,则会列出所有已经设定的变量及其值。例:文件ex1的内容如下:echofile:$0echoArguments:$*echoNo.ofargs.:$#echo2ndarg.:$2ShiftechoNo.ofargs.:$
本文标题:shell教程
链接地址:https://www.777doc.com/doc-2849436 .html