您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > 06第六章 Linux下的Shell编程
深圳讯方教学资源部Linux下的shell编程第六章Linux下的Shell编程创建和执行shell程序变量位置参数内部变量特殊字符表达式的比较重复语句条件语句杂项语句函数Linux中的各种shell创建和执行shell程序进入系统时需要设置一些别名,可以用文本编辑程序(例如vi)把这些别名放在一个文件中,然后执行这个文件,而不需要每次进入系统是都要打入所有的别名。这是一个为此目的而创建的(bash)示范文件myenv,内容如下:alias||=’ls-l’aliasdir=’ls’aliascopy=’cp’chmod命令来设置mynev为可执行的#chmod+xmynev在执行mynev前,要确保另一个条件,即mynev文件必须在查找路径中。执行如下命令可以获得查找路径。#echo$PATH如果放置mynev的文件的目录不在当前的查找路径中,那么必须把这个目录加到查找路径中。就可以从命令行中就象执行Linux命令一样来执行mynev文件。#mynev提示:必须确保shell程序的第一行是以磅符(#)开头,磅符告诉shell本行为注释。在磅符后必须由叹号(!),叹号告诉shell运行叹号之后的命令并用文件的其余部分作为输入。这是所有shell脚本惯用的做法。变量三种变量类型:环境、内部和用户。环境变量是系统的一部分,不必去定义它们。可以在shell程序中使用它们,某些变量(如PATH)还能在shell程序中加以修改。内部变量是由系统提供的。与环境变量不同,不能修改它们。用户变量是在编写shell过程中定义的。可以在shell程序中任意修改它们。Shell编程和其他编程语言的重要不同是,在shell编程过程中的变量是非类型性质的,也就是说不必指定变量是数字还是字符串。①给变量赋值(pdksh和bush环境)命令locunt=0myname=Sanjiv如果字符没有嵌入空格,可以利用上面的命令;如果字符串有嵌入的空格,可以执行如下的赋值语句:命令myname=’SanjivGuha’注意:在pdksh和bash下,必须确保等号“=”前后没有空格②访问变量值(pdksh和bush环境)可以通过变量名前置以$(美元符)来访问变量的值。假如变量名为var,利用$var就能访问这个变量。如要把var的值赋给变量lcount,可以执行如下命令:命令lcount=$var位置参数存放在变量中的第一个参数名为1(数字1),在程序内可以用$1来访问,存放在变量中的第二个参数名为2,在程序中可以利用$2来访问它,以此类推。当编写一个带有若干参数的shell脚本时,可以从命令行或从其它的shell脚本调用它。这些选项是通过Linux作为位置参数来提供给shell程序的。位置参数有系统给出的专用名。这里有一个shell程序的mypgm1,只带了一个参数(名字),并在屏幕上显示这个名字:#Namedisplayprogramif[$#-eq0]thenecho“Namenotprovided”elseecho”Yournameis$1”执行:#.Mypgm1得到输出:Namenotprovided但是,如果执行mypgm1如下:#.mypgm1sanjia则得到输出:Yournameissanjia内部变量部分内部变量:变量作用$#传给shell程序的位置参数的数目$?最后命令的完成码或在shell程序内所执行的shell程序$0shell程序的名称$*调用shell程序示所传送的全部变元的单字符串mypgm2的示范例子:#mytestprogramecho“Numberofparametersis”$#echo“Programnameis”$0echo“Parametersasasinglestringis”$*命令行中执行mypgm2如下:#.mypgm2sanjiaguha(点(.)是告诉shell执行mypgm2文件的一种方法)将得到如下的结果:Numberofparametersis2ProgramnameissanjiaParametersasasinglestringissanjiaguha特殊字符字符说明$指出shell变量名的开始|把标准输出通过管道传送到下个命令#标记注释开始&在后台执行进程?匹配一个字符*匹配一个或几个字符输出重定向操作符输入重定向操作符输出重定向操作符{添加到文件}跟在输入结束自符串后(HERE)操作符[]列出字符的范围[a-z]意指a到z的全部字符[a,z]意指a或z字符.filmname执行(“源”)filename文件空格在两个字之间的间隔符有些特殊字符应进行专门的解释。这些特殊字符是:双引号、单引号、反斜杠、以及反引号。双引号在字符串含有嵌入的空格时,必须把字符串括起来,写成:命令环境x=”abcdef”pdksh和bash双引号可以解析字符串内的所有变量。这是一个有关pdksh和bash的例子:var=”teststring”newvar=”Valueofvaris$var”echo$newvar执行上面的三行shell程序,可得到如下的结果:Valueofvaristeststring单引号利用单引号把字符括起来,以阻止shell解析变量。在下边的例子中,把前面的双引号改为单引号:pdksh和bash:var=’teststring’newvar=’Valueofvaris$var’echo$newvar执行包括上面三行的shell程序,可得到如下的结果:Valueofvaris$var正如我们所看到的,var变量没有被解析。反斜杠在某个字符前利用反斜杠可以阻止shell把后面的字符解释为特殊字符。例如要把$test的值赋给变量var。输入如下命令:命令环境var=$testpdksh和bash那么存放在var中的值将是一个空值。这是因为shell以变量test来解析$test,而test未赋给任何值,所以var为空。应该用如下的命令把$test正确的存放在var中。命令环境var=\$testpdksh和bash在$符之前的反斜杠用来告知shell如同任何其他普通的字符一样来解释$,因而$没有任何特殊的含义。反引号利用反引号(`)通知shell执行由反引号定义的字符串。当需要把执行命令的结果存放在变量中时,就可以在shell程序中利用反引号。例如,要统计当前目录下一个文件中test.txt有几行并把结果存在叫做var的变量中时,可以用下边的命令:命令环境var=`wc-ltest.txt`pdksh和bassetvar=`wc-ltest.txt`tcsh表达式的比较环境:pdksh和bash字符串比较=比较两个字符串是否相等!=比较两个字符串是否不相等-n判断字符长度是否大于零-z判断字符长度是否等于零数字比较-eq比较两个数是否相等-ge比较一个数是否大于或是等于另一个数-le比较一个数是否小于或是等于另一个数-ne比较两个数是否不等-gt比较一个数是否大于另一个数-lt比较一个数是否小于另一个数文件操作符如下的操作符可以用来做文件比较操作符:-d确定文件是否为目录-f确定文件是否为普通文件-r确定是否对文件设置了读许可-s确定文件名是否具有大于零的长度-w确定文件是否设置了写许可-x确定文件是否设置了执行许可逻辑操作符逻辑操作符是用来根据逻辑规则比较表达式。字符表示NOT、AND和OR!求反(”非”)逻辑表达式-a逻辑AND(”与”)两个逻辑表达式-o逻辑OR(”或”)两个逻辑表达式重复语句for语句第一种格式如下:forcurvarinlistdostatementsdone对list中的每个值需要执行一次statements时应使用这种格式。对每次循环,把list中的当前值赋给变量vcurvar.List可以使含有几个项的变量,或是用空格分隔的值表。For语句的这种格式是由pdksh和bash使用的。第二种格式如下:forcurvardostatementsdone在这种格式中,对传给shell_程序的每个位置参数执行一次statements。对每次循环,把位置参数的当前值赋给变量curvar。while语句while语句用来当指定的条件为真时执行一系列的命令。一旦所制定的条件判断为假时,循环就立即终止。在pdksh和bash中,利用的如下的各式:whileexpressiondostatementsdoneuntil语句until语句可以用来执行一系列命令直到所指定的条件为真才能终止。在pdksh和bash中,利用如下的格式:untilexpressiondostatementsdone正如所见到的,这种格式类似于while语句。repeat语句repeat语句是用来执行只有一个固定的次数的命令。如要在屏幕上显示连字符(-)100次,则利用如下的命令:repeat100echo‘-’select语句当编写一个要从用户联机输入的shell程序时,shell语句就可用来生成一个菜单列表。Select语句的格式如下:selectiteminitemlistdostatementsdoneitemlist是可选的。当未给出itemlist时,系统通过item中的项目一次重复一个,但当给出itemlist时,系统对itemlist中的每个项重复,对每次重复把itemlist的当前值赋给item,而后item可作为执行语句的一部分shift语句shift语句是用来处理位置参数的,并从左到右每次处理一个参数。应该记得,位置参数是用$1、$2、$3等来标识的。shift命令的作用时,把每个位置参数向左移动一个位置,而当前的$1丢失。shift命令的格式如下:shiftnumber参数number是移动的数目,是可选的。当不特别指定number时,缺省值为1,即参数向左移动一个位置。当指定number时,则向左移动number个位置。条件语句if语句if语句通过判断逻辑表达式来作出选择,在pdksh和bash中的条件语句有如下的格式:if[expression];thenstatementselif[expression];thenstatementselsestatementsfiif条件是可以嵌套的,If条件中的elif或else部分并不是必要的。如果在if语句和相继的elif语句中所指定的表达式可选的都不为真时,则可执行else部分。fi是用来指出if语句的结束。case语句case语句是用来执行依赖于离散值或是匹配指定变量值的范围的语句。在大多数情况下,如果存在大量的条件,就可以用case语句来替代if语句。pdksh和bash的case语句如下:casestrinstr1|str2)statements;;str3|str4)statements;;*)statements;;esac杂项语句break语句break语句可以用来终止重复执行的循环。这种循环可以是for、until或repeat。命令。exit语句exit语句可以用来退出shell程序。在exit之后可有选择的利用一个数字。如果当前的shell程序被另一个shell程序调用,那么这个调用程序检查代码,并做出相应的判断。函数如同其它的编程语言一样,shell程序也支持函数。函数是shell程序中执行特殊过程的部件,并在shell程序中可以重复调用。编写函数将有利于编写没有重码的shell程序。下面是在pdksh和bash中函数定义格式。func(){Statements}可以调用函数如下:funcparam1param2param3参数param1param2等是可以选择的。还能把参数作为单字符串来传送,例如$@.函数可以分析参数,就好像它们是传送给shell程序的位置参数。深圳市讯方通信技术有限公司讯方学院教学资源部
本文标题:06第六章 Linux下的Shell编程
链接地址:https://www.777doc.com/doc-3380725 .html