版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、UNIXSHELL脚本编程、几、前言将文字档设为可执行的ShellScriptScript的基本结构及观念BourneShell一、变数二、执行命令三、流程控制CShell一、变数二、执行命令三、流程控制附录Aexpr命令附录Etest命令、几、前言在Dos中,你可能会从事一些例行的重覆性工作,此时你会将这些重覆性的命令写成批次档,只要执行这个批次档就等於执行这些命令。大家会问在Unix中是否有批次处理这个东东,答案是有的。在UNIX中不只有如DOS的批次处理,它的功能比起DOS更强大,相对地也较复杂,已经和一般的高阶语言不相上下。在UNIX中大家都不叫做批次档,而叫做ShellScripto
2、一般而言,ShellScript的地位和其它的可执行档(或命令)是完全相同的,只不过ShellScript是以文字档的方式储存,而非二进位档。而执行ShellScript时,必须有一个程式将其内容转成一道道的命令执行,而这个程式其实就是Shell,这也就是为什麽我们叫做ShellScript的原因(往後我们称为Script)。不同Shell的Script基本上会有一些差异,所以我们不能将写给Ashell的Script用Bshell执行。而在UNIX中大家最常使用BourneShell以及CShell,所以这堂课就介绍这两种Script的写法。将文字档设为可执行的ShellScript如果我们已
3、经写好Script,如何将其设成可执行档呢?因为Script其实是一个可执行档,所以必须将其存取权设定成可执行。我们可以使用下列命令更改存取权:chmodu+xfilename只有自己可以执行,其它人不能执行chmodug+xfilename只有自己以及同一群可以执行,其它人不能执行chmod+xfilename所有人都可以执行而我们如何指定使用那一个Shell来解释所写的Script呢?几种基本的指定方式如下所述:如果Script的第一个非空白字元不是#,则它会使用BourneShell。如果Script的第一个非空白字元是#时,但不以#!开头时,则它会使用CShell。如果Script以#
4、!开头,则”#!”後面所写的就是所使用的Shell,而且要将整个路径名称指出来。这里建议使用第三种方式指定Shell,以确保所执行的就是所要的。BourneShell的路径名称为/bin/sh,而CShell则为/bin/csho除了在Script内指定所使用的Shell夕卜,你也可以在命令列中强制指定。比如你要用CShell执行某个Script,你可以下这个命令:cshfilename此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell也会无效,详细的情形後面会讨论。Script的基本结构及观念Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每
5、一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上,这个时候下一行的内容就会接到这一行的後面,成为同一行,如下echothemessageistoolongsowehavetosplititintoseverallines.当Script中出现“#时,再它後面的同一行文字即为注解,Shell不会对其翻译。在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执行命令时也会需要设定一些环境变数。Script的流程控制和一般高阶语言的流程控制没有什麽两样,也和高阶语言一样有副程式。这些使得Script的功能更加强大。为了达到与高阶语言相同的效果,我们
6、也可以在Script中设定变数,如此使Script成为一个名付其实的高阶语言。BourneShell一、变数BourneShell的变数型态只有字串变数,所以要使用数值运算则必须靠夕部命令达成目的。而其变数种类有下列几种:使用者变数这是最常使用的变数,我们可以任何不包含空白字元的字串来当做变数名称。设定变数值时则用下列方式:var=string取用变数时则在变数名称前加上一$号。name=Tomechonameecho$name结果如下:nameTom系统变数(环境变数)和使用者变数相似,只不过此种变数会将其值传给其所执行的命令。要将一使用者变数设定为系统变数,只要加上:exportvarna
7、me=Tomexportname以下是使用者一进入系统之後就已设定好的系统变数:$HOME使用者自己的目录$PATH执行命令时所搜寻的目录$TZ时区$MAILCHECK每隔多少秒检查是否有新的信件$PS1在命令列时的提示号$PS2当命令尚未打完时,Shell要求再输入时的提示号$MANPATHman指令的搜寻路径唯读的使用者变数和使用者变数相似,只不过这些变数不能被改变。要将使用者变数设成唯读的,只要加上:readonlyvar而若只打readonly则会列出所有唯读的变数.还有一点,系统变数不可以设定成唯读的。name=Tomreadonlynameecho$namename=Johnrea
8、donly结果如下:Tomname:isreadonlyreadonlynamereadonly特殊变数有些变数是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它唯读的系统变数,而叫它特殊变数(有些书会叫它唯读的系统变数),因为这些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读的。以下是一些等殊变数:$0这个程式的执行名字$n这个程式的第n个参数值,n=1.9$*这个程式的所有参数$#这个程式的参数个数$这个程式的PID$!执行上一个背景指令的PID$?执行上一个指令的返回值当你执行这个程式时的参数数目超过9个时,我们可以使用shift命令将参数往前移一格,
9、如此即可使用第10个以後的参数。除此之外,吾人可以用set命令改变$及$*,方法如下:setstring如此$*的值即为string,而分解後则会放入$n。如果set命令後面没有参数,则会列出所有已经设定的变数以及其值。档名:ex1参数:thisisatestechoFilename:$0echoArguments:$*echoNo.ofargs.:$#echo2ndarg.:$2shiftechoNo.ofargs.:$#echo2ndarg.:$2sethello,everyoneechoArguments:$*echo2ndarg.:$2结果如下:Filename:ex1Argument
10、s:thisisatestNo.ofargs.:42ndarg.:isNo.ofargs.:32ndarg.:aArguments:hello,everyone2ndarg.:everyone值得一提的是,当你想从键盘输入一变数值时,你可以使用下面的命令:readvar1var2这时read会将一个字分给一个变数。如果输入的字比变数还多,最後一个变数会将剩下的字当成其值。如果输入的字比变数还少,则後面的变数会设成空字串。如果需要处理数值运算,我们可以使用expr命令。其参数及输出列於附录A。二、执行命令在BourneShell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不同。直接下
11、命令这个方式和在命令列中直接下命令的效果一样。使用sh命令shcommand这个档案必须是BourneShell的Script,但这个档案并不一定要设成可执行。除此之外和直接下命令的方式一样。3使用命令.command这时和使用sh命令相似,只不过它不像sh一般会产生新的process,相反地,它会在原有的process下完成工作。使用exec命令execcommand此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个Script也会随之结束。使用命令替换这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数时,就一定要使用这个方法。我们将命令列於两个号之
12、间,而Shell会以这个命令执行後的输出结果代替这个命令以及两个符号。str=CurrentDirectoryis、pwdecho$str结果如下:Currentdirectoryis/users/cc/mgtsai这个意思是pwd这个命令输出/users/cc/mgtsai,而後整个字串代替原来的pwd设定str变数,所以str变数的内容则会有pwd命令的输出。number=expr$number+1这就是先前所提要作数值运算的方法,基本上expr命令只将运算式解,而後输出到标准输出上。如果要将某变数设定成其值,非得靠命令替换的方式不可。这个例子是将number变数的值加1後再存回numbe
13、r变数。三、流程控制在介绍流程控制之前,我们先来看看test命令。test命令的参数是条件判断式,当条件为真时则传回非零值,而条件为伪时则传回零。在所有的流程控制都必须用到test命令来判断真伪。而test命令的使用方法则列於附录test$#=0如果执行这个程式没有参数时,会传回非零值代表$#=0这个条件成立。反之则会传回零。以下介绍各种流程控制:1.ifthen语法以及流程图如下语法以及流程图如下if(condition)thenthen-commandsficondition是一个test命令。往後所介绍的各种流程中的condition都是test命令。档名:chkargif(test$#
14、!=0)thenechoArg1:$1fi$chkargHelloArg1:Hello$chkarg$ifthenelse语法以及流程图如下if(condition)thenthen-commandselseelse-commandsfiifthenelif语法以及流程图如下if(condition1)thencommands1elif(condition2)thencommands2elsecommands3fiechoWord1:creadword1echoword2:creadword2echoword3:creadword3if(test$word1=$word2-a$word2=$w
15、ord3)thenechoMatch:words1,2,&3elif(test$word1=$word2)thenechoMatch:words1&2elif(test$word1=$word3)thenechoMatch:words1&3elif(test$word2=$word3)thenechoMatch:words2&3elseechoNomatchfi4.forin语法以及流程图如下forvarinarg-listdocommandsdoneforainxxyyzzdoecho$adone结果如下:xxyyyyzz5.for语法以及流程图如下forvardocommandsdone档
16、名:Istargforadoecho$adone$Istargxxyyzzxxyyyyzz6.whiIe语法以及流程图如下while(condition)docommandsdonenumber=0while(test$number-lt10)doecho$numbercnumber=expr$number+1doneecho结果如下:0123456789until语法以及流程图如下until(condition)docommandsdone它和while的不同只在於while是在条件为真时执行回圈,而until是在条件为假时执行回圈。break及continue这两者是用於for,while
17、,until等回圈控制下。break会跳至done後方执行,而continue会跳至done执行,继续执行回圈。case语法以及流程图如下casestrinpat1)commands1;pat2)commands2;pat3)commands3;esac而pat除了可以指定一些确定的字串,也可以指定字串的集合,如下*任意字串?任意字元abca,b,或c三字元其中之一a-n从a到n的任一字元|多重选择echoEnterA,B,orC:creadlettercase$letterinA|a)echoYouenteredA.;B|b)echoYouenteredB.;C|c)echoYouenter
18、edC.;*)echoNotA,B,orC;esac10.函数格式如下function-name()commands而要呼叫此函数,就像在命令列下直接下命令一般。CShellCShell有些特性和BourneShell一样,但有些不相同。这里介绍与BourneShell不相同的地方。一、变数1.字串变数这个部分和BourneShell的变数一样,只不过在设定变数值时不能使用BourneShell的方式,而必须打:setvar=value数字运算基本上CShell没有数字变数,但CShell却有简单的方法处理数字运算:varoperatorexpressionoperator可以是C语言中的=,
19、+=,-=,,而expression则是运算式。运算式的运算子如下:()改变计算的顺序位元NOT运算!逻辑否定%取馀数C.%取馀数/除*乘-减+加右移大於=大於等於=小於等於!=不等於=等於&位元AND运算人位元XOR运算|位元OR运算&逻辑AND|逻辑OR除此之外,我们也可以检验一个档案的状态,如下-nfilename而-n可为下列之一-d档案是一个目录档案-e档案存在-f档案为一般的档案-o使用者拥有这个档案-r使用者可以读取这个档案-w使用者可以写入这个档案-x使用者可以执行这个档案-z档案长度为0count=count+1flag=-e/users/cc/mgtsai/mail&-e/
20、usr/spool/mail阵列在CShell中,我们可以宣告阵列变数,方式如下setvar=(val1val2)而var1之值为vail,var2之值为val2。而$var代表整个阵列。我们可以用$#var来计算阵列个数,也可以用$?var来检查某个变数是否已宣告。4.特殊变数$argv和BourneShell的$*相似,只不过这是一个阵列。$argvn和BourneShell的$相同,但不受个数限制。$#argv和BourneShell的$#相同$home和BourneShell的$HOME相同$path和BourneShell的$PATH相似,只不过这是一个阵列$prompt和Bourn
21、eShellfi$PS1相同$shellShell的路径名称$status和BourneShell的$?相同$和BourneShell的$相同$键盘输入二、执行命令基本上和BourneShell相同,只有一点在BourneShell中的命令在CShell中则为source命令。三、流程控制在CShell中流程控制不像BourneShell中一般需要使用test命令。相反地,它和C语言类似只要在条件中写出运式即可。当运算结果不为零时,其值为真,为零时其值为伪。以下是CShell的流程控制if语法如下if(expression)simple-commandgoto语法如下gotolabel这时程式
22、会跳至以llabel:开头的那一行执行if($#argv=2)gotogoodargsechoPleaseusetwoarguments.exitgoodrags:.ifthenelse这和BourneShell的ifthen,ifthenelse,ifthenelif相似。语法如下if(expression)thencommandsendifif(expression)thencommandselsecommandsendifif(expression)thencommandselseif(expression)thencommandselsecommandsendifforeach这和Bo
23、urneShell的forin相似。语法如下foreachvar(arg-list)commandsendwhile这和BourneShell的while相似。语法如下while(expression)commandsendbreak及continue这和BourneShell的break及continue相似,是用来中断foreach及while回圈。switch这和BourneShell的case相似。语法如下switch(string)casepat1:commands1breakswcasepat2:commands2breakswcasepat3:commands3breakswendsw附录Aexpr命令命令格式exprexpression叙述expression是由字串以及运算子所组成,每个字串或是运算子之间必须用空白隔开。下表是运算子的种类及功能,而
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电机与电气控制技术 第2版 教案9:电动机正反转控制电路调试
- 康复理疗题库及答案
- 人体解剖学(局部)题库及答案
- 混凝土工高级浇筑工艺题库及解析
- 2026年单克隆抗体生产过程优化:技术创新与效率提升
- 2026年大模型训练师能力提升培训课程
- 2026年宠物美容服务流程标准化实践
- 2026年学校校园网络布线服务协议
- 工厂加工保密协议书
- 工地看料协议书
- 2026年山东省夏季高考《数学》函数与导数专项练习及答案解析(全国I卷)
- 2026年军校考试真题语文及答案
- 2026云南中烟再造烟叶有限责任公司招聘8人笔试历年常考点试题专练附带答案详解
- 2025年公安机关人民警察高级执法资格考试真题及答案解析
- 领导干部离任交接表
- 主题三 我的毕业季(教学设计)辽师大版六年级下册综合实践活动
- JBT 9229-2024 剪叉式升降工作平台(正式版)
- 陕22N1 供暖工程标准图集
- 车用时间敏感网络通讯芯片功能和性能要求
- 《童年》读书分享PPT
- 【论网络暴力行为的刑法规制7000字】
评论
0/150
提交评论