您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Unix系统中Shell程序编写实战
1Unix系列shell程序编写*Shell是什么?1.UNIX内核和Shell的交互方法启动UNIX时,程序UNIX(内核)将被调入计算机内存,并一直保留在内存中直到机器关闭。在引导过程中,程序init将进入后台运行一直到机器关闭。该程序查询文件/etc/inittab,该文件列出了连接终端的各个端口及其特征。当发现一个活动的终端时,init程序调用getty程序在终端上显示login等登陆信息。(username和passwd),在输入密码后,getty调用login进程,该进程根据文件/etc/passwd的内容来验证用户的身份。若用户通过身份验证,login进程把用户的home目录设置成当前目录并把控制交给一系列setup程序。setup程序可以是指定的应用程序,通常setup程序为一个Shell程序,如:/bin/sh即BourneShell(command出来了,呵呵)。得到控制后,Shell程序读取并执行文件/etc/.profile以及.profile。这两个文件分别建立了系统范围内的和该用户自己的工作环境。最后Shell显示命令提示符,如$。(这是以bsh为例,若是csh,为.cshrc,ksh为.kshrc,bash为.bashrc等等)注不妨把/etc/.profile和.profile看成DOS的autoexec.bat或config.sys文件)当shell退出时,内核把控制交给init程序,该程序重新启动自动登陆过程。有两种方法使shell退出,一是用户执行exit命令,二是内核(例如root用kill命令)发出一个kill命令结束shell进程。shell退出后,内核回收用户及程序使用的资源。用户登陆后,用户命令同计算机交互的关系为:命令进程---Shell程序---UNIX内核---计算机硬件。当用户输入一个命令,如$ls,Shell将定位其可执行文件/bin/ls并把其传递给内核执行。内核产生一个新的子进程调用并执行/bin/ls。当程序执行完毕后,内核取消该子进程并把控制交给其父进程,即Shell程序。例如执行:$ps该命令将会列出用户正在执行的进程,即Shell程序(下来详细说说,别急现在)和ps程序。若执行:$sleep10&$ps其中第一条命令将产生一个在后台执行的sleep子进程。ps命令执行时会显示出该子进程。每当用户执行一条命令时,就会产生一个子进程。该子进程的执行与其父进程或Shell完全无关,这样可以使Shell去做其他工作。(Shell只是把用户的意图告诉内核,然后该干嘛干嘛)现在windows有个计划任务(在固定的时间,日期自动执行某任务),其实UNIX很早就有这个功能了,也就是所谓的Shell的自动执行。一些UNIX资源,如cron可以自动执行Shell程序而无需用户的参与,(这个功能好象在/var/spool/crotab目录里)。Crontab程序对于系统管理员来说是非常有用的。Cron服务用于计划程序在特定时间(月、日、周、时、分)运行。我们以root的crontab为例。根用户的crontab文件放在/var/spool/crontab/root中,其格式如下:(1)(2)(3)(4)(5)(6)00**3/usr/bin/updatedb1.分钟(0-60)2.小时(0-23)23.日(1-31)4.月(1-12)5.星期(1-7)6.所要运行的程序2.Shell的功能和特点1命令行解释2使用保留字3使用Shell元字符(通配符)4可处理程序命令5使用输入输出重定向和管道6维护一些变量7运行环境控制8支持Shell编程对于命令行解释就不多说了,就是在shell提示符(例如:$,%,#等)后输入一行unix命令,Shell将接收用户的输入。使用保留字:Shell有一些具有特殊意义的字,例如在Shell脚本中,do,done,for等字用来控制循环操作,if,then等控制条件操作。保留字随Shell环境的不同而不同。通配符:*匹配任何位置?匹配单个字符[]匹配的字符范围或列表例如:$ls[a-c]*将列出以a-c范围内字符开头的所有文件$ls[a,m,t]*将列出以a,m或t开头的所有文件程序命令:当用户输入命令后,Shell读取环境变量$path(一般在用户自己的.profile中设置),该变量包含了命令可执行文件可能存在的目录列表。shell从这些目录中寻找命令所对应的可执行文件,然后将该文件送给内核执行。输入输出重定向及管道:重定向的功能同DOS的重定向功能:重定向输出重定向输入而管道符号,是unix功能强大的一个地方,符号是一条竖线:|,用法:command1|command2他的功能是把第一个命令command1执行的结果作为command2的输入传给command2,例如:$ls-s|sort-nr|pg该命令列出当前目录中的所有文件,并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。然后把排序后的内容传送给pg命令,pg命令在显示器上显示sort命令排序后的内容。3维护变量:Shell可以维护一些变量。变量中存放一些数据供以后使用。用户可以用=给变量赋值,如:$lookup=/usr/mydir该命令建立一个名为lookup的变量并给其赋值/usr/mydir,以后用户可以在命令行中使用lookup来代替/usr/mydir,例如:$echo$lookup结果显示:/usr/mydir为了使变量能被子进程使用,可用exprot命令,例如:$lookup=/usr/mydir$exportlookup运行环境控制:当用户登陆启动shell后,shell要为用户创建一个工作的环境,如下:1当login程序激活用户shell后,将为用户建立环境变量。从/etc/profile和.profile文件中读出,在这些文件中一般都用$TERM变量设置终端类型,用$PATH变量设置Shell寻找可执行文件的路径。2从/etc/passwd文件或命令行启动shell时,用户可以给shell程序指定一些参数,例如-x,可以在命令执行前显示该命令及其参数。后面详细介绍这些参数。shell编程:本文主要介绍的内容。shell本身也是一种语言(*可以先理解为unix命令的组合,加上类C的条件,循环等程序控制语句,类似dos批处理,但要强大的多),用户可以通过shell编程(脚本,文本文件),完成特定的工作。SHELL变量下面我们详细的介绍BourneShell的编程:自从贝尔实验室设计了BourneShell。从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。但在众多版本的unix中,BourneShell一直保持一致。1Bsh的启动:用户在登陆后,系统根据文件/etc/passwd中有关该用户的信息项启动Shell。例如某用户在passwd中的信息项为:ice_walk:!:411:103:Imsnow,ice_walk:/home/ice_walk:/bin/bsh则表明,用户名是ice_walk等信息,在最后一项/bin/bsh表明用户的sh环境类型是bsh,于是系统启动之。在启动或执行(包括下面我们要讲的shell程序--脚本)过程中可以使用以下一些参数,我们一一说明:-a将所有变量输出-cstring从string中读取命令-e使用非交互式模式-f禁止shell文件名产生-h定义4-i交互式模式-k为命令的执行设置选项-n读取命令但不执行-r受限模式-s命令从标准输入读取-t执行一命令,然后退出shell-u在替换时,使用未设置的变量将会出错-v显示shell的输入行-x跟踪模式,显示执行的命令许多模式可以组合起来用,您可以试试了,但-ei好象不行,你说why呢?使用set可以设置或取消shell的选项来改变shell环境。打开选项用-,关闭选项用+,多数unix允许打开或关闭a、f、e、h、k、n、u、v和x选项。若显示Shell中已经设置的选项,执行:$echo$-Bsh中每个用户的home目录下都有一个.profile文件,可以修改该文件来修改shell环境。为了增加一个可执行文件的路径(例如/ice_walk/bin),可以把下面代码加入.profile中PATH=$PATH:/ice_walk/bin;exprotPATH.profile中shell的环境变量意思如下:CDPATH执行cd命令时使用的搜索路径HOME用户的home目录IFS内部的域分割符,一般为空格符、制表符、或换行符MAIL指定特定文件(信箱)的路径,有UNIX邮件系统使用PATH寻找命令的搜索路径(同dos的config.sys的path)PS1主命令提示符,默认是$PS2从命令提示符,默认是TERM使用终端类型2Bsh里特殊字符及其含义在Bsh中有一组非字母字符。这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符控制。他们可以让用户在Shell中使用最少的代码完成复杂的任务。*Shell变量名使用的特殊字符$#传送给命令Shell的参数序号$-在Shell启动或使用set命令时提供选项$?上一条命令执行后返回的值$$当前shell的进程号$!上一个子进程的进程号$@所有的参数,每个都用双括号括起$*所有参数,用双括号括起$n位置参数值,n表示位置$0当前shell名5*产生文件名的特殊字符包括*,?,[],上面讲过,不再多说。*数据或程序控制使用的特殊字符(file)输出重定向到文件中(没有文件则创建,有则覆盖)(file)输出重定向到文件中(没有则创建,有则追加到文件尾部)(file)输入重定向到文件;命令分割符|管道符&后台运行(例如:sleep10&)``命令替换,重定向一条命令的输出作为另一命令的参数*对于引用或逃逸的特殊字符Bsh用单引号''和双引号将特殊字符或由空白分隔的字引用起来组成一个简单的数据串.使用单引号和双引号的区别是双引号中的内容可进行参数和变量替换.逃逸字符也一样.$echo$HOME$PAT.3H结果显示$/u/ice_walk/bin:/etc:/usr/bin而$echo'$HOME$PATH'结果显示$HOME$PATHshell的逃逸符是一个\,表示其后的字符不具有特殊的含义或不是shell的函数$echo\$HOME$PATH结果显$$HOME/bin:/etc:/usr/bin:3Bsh的变量前面我们在多个地方引用了变量,当Shell遇到一个$符时(没有被引用或逃逸),它将认为其后为一变量。不论该变量是环境变量还是用户自定义的变量,在命令行中变量名要被变量值替换。例如命令:ls$HOME将列出变量HOME对应目录下的文件。用户可以在命令行中的任何地方进行变量替换。包括命令名本身,例如:$dir=ls$$dirf*将列出以f开头的文件。现在详细的介绍下Bsh的变量。Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。用户定义的变量:6用户定义的变量由字母和下划线组成,并且变量名的第一个字符不能为数字(0~9)。与其他UNIX名字一样,变量名是大小写敏感的。用户可以在命令行上用=给变量赋值,例如:$NAME=ice_walk给变量NAME赋值为ice_walk,在应用变量NAME的时候,在NAME前加$即可,前面已说,不再废话(别说我废话多,关键是没当过老师)。可以用变量和其他字符组成新的字,例如:$SUN=sun$echo${SUN}day在应用shell变量时候,可以在变量名字两边$后面加上{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。结果显示:sunday(注意不能echo$SUNday,因为SUNday变量没定义,读者试下执行结果)用户也可以在命令行上同时对多个变量赋值,赋值语句之间用空格分开:$X=xY=y注意变量赋值是从右到
本文标题:Unix系统中Shell程序编写实战
链接地址:https://www.777doc.com/doc-4013155 .html