第3章Linux shell编程.ppt

上传人:qwe****56 文档编号:70019775 上传时间:2023-01-14 格式:PPT 页数:72 大小:252KB
返回 下载 相关 举报
第3章Linux shell编程.ppt_第1页
第1页 / 共72页
第3章Linux shell编程.ppt_第2页
第2页 / 共72页
点击查看更多>>
资源描述

《第3章Linux shell编程.ppt》由会员分享,可在线阅读,更多相关《第3章Linux shell编程.ppt(72页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Linux开发基础第三章Shell编程Shell的工作原理Shell的种类在Bash中的操作Shell的登录环境环境和Shell变量基础Shell编程什么是shellShell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实

2、用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其它程序向Linux传递命令时,内核会做出相应的反应。shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其它应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。Shell命令有两种形式:内部命令,存在于内存中,比如cd。外部命令,存在于文件系统中某个目录下的单独的程序,例如cp、rmshell的工作原理Lin

3、ux系统Shell的启动过程:1)内核(/unix,/vmunix,/boot/zImage等)将加载至内存,直到系统关机;2)init将扫描/etc/inittab(inittab列出可用的终端及其属性),一旦找到活动的终端,mingetty会给出login提示符和口令,mingetty提示输入用户及口令;3)将用户名及口令传递给login,login验证用户及口令是否匹配,如果身份验证通过,login将会自动转到其$HOME;4)将控制权移交到所启动的任务(在移交之前分别完成setgid,setuid).如在/etc/passwd文件中用户的shell为/bin/sh。5)读取文件/etc

4、/profile和$HOME/.profile中系统定义变量和用户定义变量,系统给出shell提示符$PROMPT,对普通用户用$作提示符,对超级用户(root)用#作提示符。6)在shell提示符,就可以键入命令名称(或shell程序)及所需要的参数。shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它。7)当用户准备结束登录对话进程时,可以键入logout命令、exit命令或按ctrl+d,结束后控制权将交给init。Linux的启动过程shell的种类shell有多种类型,最常用的几种是Bournesh

5、ell(shbash)、Cshell(cshtcsh)和Kornshell(ksh)。三种shell各有优缺点:Bourneshell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourneshell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其它几种shell。Linux操作系统缺省的shell是BourneAgainshell,它是Bourneshell的扩展,简称Bash,与Bourneshell完全向后兼容,并且在Bourneshell的基础上增加、增强了很多特性。它可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多Cshell和Kor

6、nshell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。Cshell是一种比Bourneshell更适于编程的shell,它的语法与C语言很相似。Tcsh是Cshell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅和Bashshell是提示符兼容,而且还提供比Bashshell更多的提示符参数。Kornshell集合了Cshell和Bourneshell的优点并且和Bourneshell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。Lin

7、ux还包括了一些流行的shell如ash、zsh等。在Bash中的操作技巧(1/2)Bash命令行具有命令和文件名扩展特性当输入一个还没完成的命令或文件名时,只需键入Tab键就能激活命令和文件名扩展特性,从而完成该命令的剩余输入。$catmy$catmyfileBash也能列出当前目录下部分匹配的文件名来完成文件名扩展。如果键入Esc,然后键入?,shell将列出所有与输入的字符串相匹配的文件名。$lsdocumentdocudrama$catdocdocumentdocudrama$catdocudrama在Bash中的操作技巧(2/2)命令行编辑在Bash中可以对命令行进行编辑,以便用户在

8、执行所键入的命令之前能够修改所键入的命令。如果在键入命令时出现拼写错误,只需在运行所键入的命令之前,使用编辑命令来纠正编辑错误,然后执行它,而不用重新输入整行命令命令历史在Bash中,history命令能够保存最近所执行的命令。这些命令的历史记录号从1开始,只有有限个命令可以被保存起来,最多500个。要查看最近执行的命令,只要键入history命令。最简便的方法就是利用上下箭头键,把先前的事件逐次显示到命令行。按动一下上箭头键,那么上一次执行的一个事件就将出现在命令行上,再按一下,上一次的前一事件又会出现在命令行上;按动一下下箭头键,将会使当前事件的下一事件出现在命令行上。还有一个查询和执行历

9、史事件的命令!命令。在!命令后键入与历史事件相关联的字符,这个关联字符可以是历史事件的历史事件号,也可以是该事件的前几个字符。登录环境Shell的另一个重要功用是提供个人化的使用者环境,这通常在shell的初始化文件中完成(.bash_profile、.profile、.login、.cshrc、.tcshrc等等)。这些文件包括了设定终端键盘和定义窗口的特征;设定环境变量,定义搜寻路径、权限、提示符号和终端类型;以及设定特殊应用程序所需要的变量,例如窗口、文字处理程序、及程序语言的链接库。Kornshell和Cshell加强了个性化的能力:增加历史、别名、和内建变量集以避免使用者误删文档。登

10、录系统时,在进入命令提示符前。需键入用户名和密码,系统需查询/etc/passwd文件检查是否为有效用户,如果登录名正确并且密码有效,启动/etc/passwd文件规定的shell,即登录成功。登录成功后,系统执行两个环境设置文件,第一个是/etc/profile,第二个是位于用户根目录下.bash_profile或.profile。系统还会处理其他的初始化文件。/etc/profile文件:用户登录时,自动读取/etc目录下profile文件,包含:全局或局部环境变量、PATH信息、终端设置、安全命令、日期信息或放弃操作信息等信息。用户的$HOME/.bash_profile:/etc/pr

11、ofile文件执行后,用户将执行自己的$HOME目录中的.bash_profileshell程序的变量和参数像高级程序设计语言一样,shell也提供说明和使用变量的功能。shell变量可以保存诸如路径名、文件名或者一个数字。对shell来讲,所有变量的取值都是一个字符串。shell程序采用$var的形式来引用名为var的变量的值。Shell有以下几种基本类型的变量:用户定义的变量shell定义的环境变量位置参数预定义变量参数置换的变量用户定义的变量(1/2)定义自己的变量变量名=变量值或$变量名=变量值在定义变量时,变量名前不应加符号“$”,在引用变量的内容时则应在变量名前加“$”;在给变量赋

12、值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来。说明一个变量为只读readonly变量名变量默认都只是当前shell的局部变量,将变量成为公共变量的格式为:export变量名也可以在给变量赋值的同时使用export命令:export变量名=变量值使用export说明的变量,在shell以后运行的所有命令或程序中都可以访问到用户定义的变量(2/2)显示变量使用echo命令可以显示单个变量取值,并在变量名前加$,例如:$myvar=howareyou$echo$myvar清除变量使用unset命令清除变量。unsetvarname显示所有本地shell变量使

13、用set命令显示所有本地定义的shell变量shell定义的环境变量shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义。环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在.bash_profile或/etc/profile文件中设置了环境变量。传统上,所有环境变量均为大写。设置环境变量VARNAME=value;exportVARNAME显示环境变量使用env命令可以查看所有的环境变量。清除环境变量使用unset命令清除环境变量。常用的shell环境变量HOME:用于保存注册目录的完全路径名。PATH:用于保存用冒号分隔的目录路径名,sh

14、ell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。$PATH=$HOME/bin:.:/bin:/usr/bin;exportPATHTERM:终端的类型。UID:当前用户的标识符,取值是由数字构成的字符串。PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。PS1:主提示符,在特权用户下,缺省的主提示符是#,在普通用户下,缺省的主提示符是$。PS2:在shell接收用户输入命令的过程中,如果用户在输入行的末尾输入然后回车,或者当用户按回车键时shell判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余

15、部分,缺省的辅助提示符是。IFS:IFS用作shell指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空格、tab键。LOGNAME:此变量保存登录名。SHELL:SHELL变量保存缺省shell,通常在/etc/passwd中已设置位置参数位置参数是一种在调用shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。$0是一个特殊的变量,它的内容是当前这个shell程序的文件名,所以,$0不是一个位置参数,在显示当前所有的位置参数时是不包括$0的预定义变量预定义

16、变量和环境变量相类似,也是在shell一开始时就定义了的变量,所不同的是,用户只能根据shell的定义来使用这些变量,而不能重定义所有预定义变量都是由$符和另一个符号组成的,常用的shell预定义变量有:$#:位置参数的数量$*:所有位置参数的内容$?:命令执行后返回的状态$:当前进程的进程号$!:后台运行的最后一个进程号$0:当前执行的进程名其中,$?用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。$变量最常见的用途是用作临时文件的名字以保证临时文件不会重复参数置换的变量(1/2)shell在遇到未设置的变量时,将其值作为空串处理

17、。而在实际应用中,对未设置的变量,用户可以根据需要采用不同的处理方式,这可通过变量替换来实现。变量替换提供了三种功能:允许替换未设置变量的隐含值;允许对未设置变量赋值;在访问未设置变量时,提示出错信息。参数置换的变量(2/2)参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能分别如下。a.变量=$参数-word:如果设置了参数,则用参数的值置换变量的值,否则用word置换。b.变量=$参数=word:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word然后再用word替换参数的值。注意,位置参数不能用于这种方

18、式,因为在shell程序中不能为位置参数赋值。c.变量=$参数?word:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从shell中退出,如果省略了word,则显示标准信息。这种方式常用于出错指示。d.变量=$参数+word:如果设置了参数,则用word置换变量,否则不进行置换。所有这四种形式中的参数既可以是位置参数,也可以是另一个变量,只是用位置参数的情况比较引号引用必要性在shell中所使用的许多特殊符号也可为其他目的所使用,因此当不需要引用这些字符的特殊含义时,就必须引用加以删除。例如$echohowareyou*文本返回了,但由于未使用双引号,*被shell误解,sh

19、ell认为用户要做目录列表。采用双引号就不会有误解产生。$echohowareyou*shell引用类型:双引号单引号反引号反斜线双引号使用双引号可引用除字符$、“外的任意字符或字符串。这些特殊字符分别为美元符号,反引号,反斜线和双引号,对shell来说,它们有特殊意义。如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。$string=goodafternoon$echo$stringgoodafternoon单引号单引号将消除被括在单引号中的所有特殊字符的含义。$g=test$echothisis$gthisistest$echo$g$g反引号反引号用于设置系统命令的输出

20、到变量。shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与双引号结合使用。$echotodayisdatetodayisSunApr2814:21:35CST2002$echotodayisdatetodayisdate反斜线(转义符)如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:&*+$|?。假定echo命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*。为屏蔽星号特定含义,可使用反斜线。$echo*在打印字符串时要加入八进制字符(ASCII相应字符),必须在前面加反斜线

21、,否则shell将其当作普通数字处理。$echo-ethisisacopyright250signthisisacopyrightsign特殊字符串引用的例外引用双引号、单引号和转义符都不能消除对echo命令有特殊功能的控制的特殊含义。b退格c显示后不换行f在终端上屏幕的开始处显示n换行r回车t制表符v垂直制表符反斜线shell脚本介绍使用shell脚本的原因脚本内容运行shell程序的方法使用shell脚本的原因shell脚本在处理自动循环或大的任务方面可节省大量的时间,且功能强大。如果你有处理一个任务的命令清单,不得不一个一个敲进去,然后观察输出结果,再决定它是否正确,如果正确,再继续下一

22、个任务,否则再回到清单一步步观察。一个任务可能是将文件分类、向文件插入文本、迁移文件、从文件中删除行、清除系统过期文件、以及系统一般的管理维护工作等等。创建一个脚本,在使用一系列系统命令的同时,可以使用变量、条件、算术和循环快速创建脚本以完成相应工作。这比在命令行下一个个敲入要节省大量的工作时间。shell脚本可以在行命令中接收信息,并使用它作为另一个命令的输入。脚本内容脚本第一行总是以#!/bin/bash开始,这段脚本通知shell使用系统上的BourneAgainshell解释器。注释行需要此行的第一个字符为#,解释器对此行不予解释。在第二行注释中写入脚本名是一个好习惯。#!/bin/s

23、h#对变量赋值:a=helloworld#现在打印变量a的内容:echoAis:echo$a运行shell程序的方法shshell程序文件名。这种方法的命令格式为:bashshell程序文件名这实际上是调用一个新的bash命令解释程序,而把shell程序文件名作为参数传递给它。新启动的shell将去读指定的文件,执行文件中列出的命令,当所有的命令都执行完结束。该方法的优点是可以利用shell调试功能。用chmod命令使shell程序成为可执行的一个文件能否运行取决于该文件的内容本身可执行且该文件具有执行权。对于shell程序,当用编辑器生成一个文件filename时,需给予执行权限:chmod

24、+xfilename当用户需要运行这个文件时,只需要直接键入文件名即可。./filename当一个shell程序已经调试好时,应使用第这种方式把它固定下来,并加入相应的搜索路径,以后只要键入相应的文件名即可,并可被另一个程序所调用。bash的内部命令(1/3)bash命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由shell本身提供。常用的内部命令有:echo命令格式:echoarg功能:在屏幕上打印出由arg指定的字符串。eval命令格式:evalargs功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。exe

25、c命令格式:exec命令命令参数功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序中exec后面的语句将不再被执行。bash的内部命令(2/3)export命令格式:export变量名或:export变量名=变量值功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。注意:不带任何变量名的export语句将显示出当前所有的export变量readonly命令格式:read

26、only变量名功能:将一个用户定义的shell变量标识为不可变的。不带任何参数的readonly命令将显示出所有只读的shell变量。read命令格式:read变量名表功能:从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。bash的内部命令(3/3)shift语句功能:shift语句按如下方式重新命名所有的位置参数变量:$2成为$1,$3成为$2在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减一,直到减到0。wait功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。exit功能:退出shell程序

27、。在exit之后可有选择地指定一个数字作为返回状态。“.”(点)命令格式:.Shell程序文件名功能:使shell读入指定的shell程序文件并依次执行文件中的所有语句。“:”命令格式:功能:空命令,通常放在行的最左边,实际不作任何命令,只返回出口代码0shell程序设计的流程控制test测试命令流控制test测试命令字符串测试文件测试测试时使用逻辑操作符混合命令条件执行字符串测试=:等于则为真!=:不相等则为真-z字符串:字符串为空串为真-n字符串:字符串为非空串为真例:$-z$HOME$echo$?1文件测试-e文件名:如果文件存在则为真-r文件名:如果文件存在且可读则为真-w文件名:如果

28、文件存在且可写则为真-x文件名:如果文件存在且可执行则为真-s文件名:如果文件存在且非空则为真-d文件名:如果文件存在且为目录则为真-f文件名:如果文件存在且为普通文件则为真-c文件名:如果文件存在且为字符型特殊文件则为真-b文件名:如果文件存在且为块特殊文件则为真例:$-ftest$echo$?0测试时使用逻辑操作符shell提供三种逻辑操作完成此功能。-a:逻辑与,操作符两边均为真,结果为真,否则为假。-o:逻辑或,操作符两边一边为真,结果为真,否则为假。!:逻辑否,条件为假,结果为真。其优先级为:!最高,-a次之,-o最低。例:$-xprog1axprog2$?0混合命令条件执行A.使用

29、&command1&command2这种命令执行方式相当地直接。&左边的命令(command1)返回真(即返回0,成功被执行)后,&右边的命令(command2)才能够被执行;B.使用|command1|command2|的作用有一些不同。如果|左边的命令(command1)未执行成功,那么就执行|右边的命令(command2);或者换句话说,“如果这个命令执行失败了|那么就执行这个命令”C.command1&command2&command3当command1,command2成功时才执行command3D.command1&command2|comamnd3仅当command1成功,com

30、mand2失败时才执行command3流控制if条件语句if、then、else语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数值或字符串的比较。这些测试返回值或者为真(0),或者为假(1)。基于此结果,可以进行相关操作case语句case语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他声明if条件语句if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。if语句结构对错误检查非常有用。其格式为:if条件1then命令1elif条件2then命令2else命令3fiif语句必须以单词fi终止。elif和else为可选项,如果语句中没

31、有否则部分,那么就不需要elif和else部分。If语句可以有许多elif部分。最常用的if语句是ifthenfi结构。使用if语句时,必须将then部分放在新行,否则会产生错误。如果要不分行,必须使用命令分隔符。现在简单if语句变为:if条件;then命令fi有时要嵌入if语句。为此需注意if和fi的相应匹配使用。而测试两个以上的条件需使用ifthenelse语句的elif部分。case语句case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:case值in模式1)模式2)命令1命令2.;*)其他命令行esaccase取值后面

32、必须为in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*捕获该值。模式中可包括元字符:*、?、.(类或范围中任意字符)循环循环或跳转是一系列命令的重复执行过程,有3种循环语句:for循环-每次处理依次列表内信息,直至循环耗尽。Until循环-此循环语句不常使用,until循环直至条件为真。条件部分在循环末尾部分。While循环-while循环当条件为真时,循环执行,条件部分在循环头。流控制语句的任何循环均可嵌套使用,例如可

33、以在一个for循环中嵌入另一个for循环bash的主要循环for循环while循环until循环break和continuefor循环for循环一般格式为:for变量名in列表do命令1命令2done当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的shell命令和语句。变量名为任何单词。In列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换、字符串和文件名。如果省略了in,则变量var的取值将是位置参数。for循环嵌入for变量名1in列表1dofor变量名2in列表2do命令1.donedonewhile循环whil

34、e循环用于不断执行一系列命令,也用于从输入文件中读取数据:while条件(或命令)do命令1命令2.done虽然通常只使用一个命令,但在while和do之间可以放几个命令。命令通常用作测试条件。只有当命令的退出状态为0时,do和done之间命令才被执行,如果退出状态不是0,则循环终止until循环until循环执行一系列命令直至条件为真时停止。until循环与while循环在处理方式上刚好相反。while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。until循环格式为:until条件do命令1.done条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次b

35、reak和continue有时需要基于某些准则退出循环或跳过循环步。shell提供两个命令实现此功能。breakbreak命令允许跳出循环。break通常在进行一些处理后退出循环或case语句。如果是在一个嵌入循环里,可以指定跳出的循环个数。例如如果在两层循环内,用break刚好跳出整个循环。continuecontinue命令类似于break命令,只有一点重要差别,它不会跳出循环,只是跳过这个循环步。Shell函数定义有些脚本段间互相重复。shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。定义函数的格式为:函数名()或者函数名()命令1.命令1.两者方式都可行。如果愿

36、意,可在函数名前加上关键字function,这取决于使用者。function函数名().函数的特点可以将函数看作是脚本中的一段代码,但是有一个主要区别。执行函数时,它保留当前shell和内存信息。函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用函数的调用调用函数的格式为:函数名param1param2向函数传递参数就像在一般脚本中使用特殊变量$1,$2.$9一样,函数取得所传参数后,将原始参数传回shell脚本,因此最好先在函数内重新设置变量保存所传的参数。这样如果

37、函数有一点错误,就可以通过已经本地化的变量名迅速加以跟踪。函数里调用参数(变量)的转换以下划线开始,后加变量名,如:_FILENAME或_filename。当函数完成处理或希望函数基于某一测试语句返回时,可做两种处理:1)让函数正常执行到函数末尾,然后返回脚本中调用函数的控制部分。2)使用return返回脚本中函数调用的下一条语句,可以带返回值。0为无错误,1为有错误。这是可选的,其格式为:return从函数中返回,用最后状态命令决定返回值。Return0无错误返回。Return1有错误返回例子#!/bin/bashis_it_directory()if$#-lt1;thenechoIneed

38、anargumentreturn1 fi_DIRECTORY_NAME=$1if!d_DIRECTORY_NAME;thenreturn1Elsereturn0fiechonenterdestinationdirectory:ReadDIRECIfis_it_directory$direc;then:elseecho$DIRECdoesnotexist.fiShell命令分组在shell中有两种命令分组的方法:()和。用(command_list;)将一组命令括起来,则这些命令会由子shell来完成;当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变

39、影响到下面语句的执行时,就应该把这些命令放在圆括弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰。而command_list;则在当前shell中执行。用于将顺序执行的命令的输出结果用于另一个命令的输入。这两者的主要区别在于其对shell变量的影响,子shell执行的命令不会影响当前shell中的变量。分组示例$(A=2;B=2;NUMBER=expr$A+$B;echo$NUMBER)4$echo$NUMBER2$A=2;B=2;NUMBER=expr$A+$B;echo$NUMBER;4$echo$NUMBER4Shell信号信号就是系统向脚本或命令发出的消息,告知它们

40、某个事件的发生。有些信号可以被应用程序或脚本捕获,并依据该信号采取相应的行动。另外一些信号不能被捕获。例如,如果一个命令收到了信号9,就无法再捕捉其他信号。在编写shell脚本时,只需关心信号1、2、3和15。当脚本捕捉到一个信号后,它可能会采取下面三种操作之一:1)不采取任何行动,由系统来进行处理。2)捕获该信号,但忽略它。3)捕获该信号,并采取相应的行动。大多数的脚本都使用第一种处理方法。如果想要采取另外两种处理方法,必须使用trap命令。trap命令trap对上面三种方式提供了三种基本形式:第一种形式的trap命令在shell接收到signallist清单中数值相同的信号时,将执行双引号

41、中的命令串。trapcommandssignal-listtrapcommandssignal-list第二种形式为了恢复信号的默认操作使用的trap命令:trapsignal-list第三种形式的trap命令允许忽视信号:trapsignal-listtrap命令说明(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句)时发出该信号。(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将shell程序终止的话,shel

42、l程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致shell程序无法终止。另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替信号示例信号示例下面的例子一经运行就开始计数直至用户按(信号2SIGINT来自键盘的中断信号)。这时该脚本将会显示出当前的循环数字,然后退出:#!/bin/bash#traptrapmy_exit2LOOP=0my_exit

43、()echoYoujusthit,atnumber$LOOPechoIwillnowexitexit1while:do LOOP=expr$LOOP+1 echo$LOOPdone由于设置了trap命令,所以在捕捉到信号2以后,双引号内的my_exit函数将被执行。函数my_exit将在脚本捕捉到信号2后被调用;用户将会看到$LOOP变量的内容,即用户按时的计数值bash程序的调试(1/2)shell程序的调试是利用bash命令解释程序的选项。调用bash的形式是:bash-选择项shell程序文件名几个常用的选择项是:-n测试shell脚本语法结构,只读取shell脚本但不执行-x进入跟踪方

44、式,执行命令时把命令和它们的参数显示出来-e非交互方式,如果一个命令失败就立即退出-I交互方式-k从环境变量中读取命令的参数-r限制方式,不能执行如下操作:cd,更改PATH,指定全路径名,输出重定向,因此可以提供一个较好的控制和安全机制。通常rsh用于应用型用户及拨号用户,这些用户通常是看不到提示符的。通常受限制用户的主目录是不可写的。bash程序的调试(2/2)-t执行命令后退出(shellexits)-u置换时把未设置的变量看作出错-vverbose,当读入shell输入行时把它们显示出来通常使用-x进行跟踪执行,执行并显示每一条指令。上面的所有选项也可以在shell程序内部用set-选

45、择项的形式引用,而set+选择项则将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时,则可以将该部分用上面两个语句包围起来未置变量退出和立即退出如果引用了一个未赋值的变量就终止shell程序的执行。shell通常允许未置变量的使用,在这种情况下,变量的值为空。如果设置了未置变量退出选择项,则一旦使用了未置变量就显示错误信息,并终止程序的运行。未置变量退出选择项为-u。当shell运行时,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时,如果未经重新定向,该出错信息会打印在终端屏幕上,而shell程序仍将继续执行。要想在错误发生时迫使shell程序立即结束,可以使用-

46、e选项将shell程序的执行立即终止shell程序的跟踪调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来因此,它们的主要区别在于:在执行命令行之前无“-v”则打印出命令行的原始内容,而有“-v”则打印出经过替换后的命令行的内容还可以在shell程序内部采取一些辅助调试的措施。例如,可以在shell程序的一些关键地方使用ech

47、o命令把必要的信息显示出来,这样就可以知道程序运行到什么地方及程序目前的状态正则表达式简介历史内容用法历史正则表达式(REs)最早是由数学家StephenKleene于1956年提出,他是在对自然语言的递增研究成果的基础上提出来的。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被OpenGroup组织认定。内容正则表达式并非一门专用语言,但它可用于在一个文件或字符里查找和替代文本的一种标准。它具有两种标准:基本的正则表达式(BRE),扩展的正则表达式(ERE)。ERE包括BRE

48、功能和另外其它的概念。许多程序中都使用了正则表达式,包括xsh,egrep,sed,vi以及在UNIX平台下的程序。它们可以被很多语言采纳,如HTML和XML,这些采纳通常只是整个标准的一个子集用法正则表达式的关键之处在于确定你要搜索匹配的东西,如果没有这一概念,Res将毫无用处每一个表达式都包含需要查找的指令字符匹配见下页表操作解释例子结果.Matchanyonecharactergrep.ordsample.txtWillmatch“ford”,“lord”,“2ord”,etc.inthefilesample.txt.Matchanyonecharacterlistedbetweenth

49、ebracketsgrepcngordsample.txtWillmatchonly“cord”,“nord”,and“gord”Matchanyonecharacternotlistedbetweenthebracketsgrepcnordsample.txtWillmatch“lord”,“2ord”,etc.butnot“cord”or“nordgrepa-zA-Zordsample.txtWillmatch“aord”,“bord”,“Aord”,“Bord”,etc重复操作符重复操作符,或数量词,都描述了查找一个特定字符的次数。它们常被用于字符匹配语法以查找多行的字符参见下页表锚锚锚

50、是指它所要匹配的格式,如下页图所示。使用它能方便你查找通用字符的合并。例如,我用vi行编辑器命令:s来代表substitute,这一命令的基本语法是:s/pattern_to_match/pattern_to_substitute/间隔Res中的另一可便之处是间隔(或插入)符号。实际上,这一符号相当于一个OR语句并代表|符号。下面的语句返回文件sample.txt中的“nerd”和“merd”的句柄:egrep“(n|m)erd”sample.txt间隔功能非常强大,特别是当你寻找文件不同拼写的时候,但你可以在下面的例子得到相同的结果:egrep“nmerd”sample.txt当你使用间隔功

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com