第4章Shell编程.ppt
ShellProgrammingUNIXShell程序程序设计Shell的双重特性:的双重特性:命令解释程序(命令解释器):命令解释程序(命令解释器):Shell解释用户输入的命令行,提交系统内核解释用户输入的命令行,提交系统内核处理,并将结果返回给用户;处理,并将结果返回给用户;Shell与与UNIX命令一样都是实用程序,但有区命令一样都是实用程序,但有区别。一旦用户注册到系统后,别。一旦用户注册到系统后,Shell就被系统装就被系统装入内存,并一直运行到用户退出系统之止;而一入内存,并一直运行到用户退出系统之止;而一般命令仅当被调用时,才由系统装入内存执行。般命令仅当被调用时,才由系统装入内存执行。程序设计语言:程序设计语言:Shell本身也是一种可编程的程序设计语言。本身也是一种可编程的程序设计语言。做为用户与做为用户与Unix系统内核之间的界面,系统内核之间的界面,Shell接受、接受、解释并执行用户命令。解释并执行用户命令。Shell执行用户命令的工作过程大体上表现为这样执行用户命令的工作过程大体上表现为这样一个循环:一个循环:while(1)prompt(“command:”);/*打印提示符打印提示符*/read(command);/*读入并分析命令读入并分析命令*/execute(command);/*执行命令执行命令*/4.1 命令解释程序命令解释程序执行一个执行一个shell命令行时,通常会自动打开三个标准文件,即:命令行时,通常会自动打开三个标准文件,即:标准输入文件(标准输入文件(stdin),通常对应终端的键盘;),通常对应终端的键盘;标准输出文件(标准输出文件(stdout)和标准错误输出文件()和标准错误输出文件(stderr),),这两个文件都对应终端的屏幕。这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。到标准输出文件,而将错误信息送到标准错误文件中。以上三个标准文件的文件标识符分别为以上三个标准文件的文件标识符分别为0号、号、1号、号、2号。号。4.1.1 输入输出重定向输入输出重定向当标准文件描述符被分配给终端以外的对象,就称为当标准文件描述符被分配给终端以外的对象,就称为I/O重定向重定向,由由“”、“”、“”、“mydirlist$pwdmydirlist$pwdmydirlist$datemydirlist$catfile1file2file3用用,等符号改变标准流的方向,等符号改变标准流的方向,分析以下命令的结果:分析以下命令的结果:$(lsl;pwd;date)mydirlist$mailtomfile$myprogtestdatafile$commandstring,为,为“行输入重定向行输入重定向”,较少使用。,较少使用。$myprogoutfile/*同时使用输入输出重定向同时使用输入输出重定向*/如果将标准输出和标准错误输出流都定向到同一文件,如果将标准输出和标准错误输出流都定向到同一文件,BShell中用中用2&1来实现,来实现,CShell中用中用&来实现。试分析:来实现。试分析:%ccabc.clog%ccabc.c&log$ccabc.clog$ccabc.c2&1log对于标准错误输出流的重定向,不同的对于标准错误输出流的重定向,不同的shell修改修改方法有所不同。方法有所不同。CShell%(ccabc.clog)&errorlog%(find/-namefilea-print/dev/tty)&errorlog如果是重定向到不同文件,如果是重定向到不同文件,BShell用用2来指示标准错误输来指示标准错误输出:出:$ccabc.clog2errorlog$find/-namefilea-print2errorlog管道线实现了管道线实现了Unix命令功能的组合。命令功能的组合。它将一个命令(或程序)的输出作为另一个命令(或它将一个命令(或程序)的输出作为另一个命令(或程序)的输入。程序)的输入。记为记为a|b,表示把表示把a命令的输出作为命令的输出作为b命令的输入,命令的输入,实现了输出重定向和输出重定向功能的组合。实现了输出重定向和输出重定向功能的组合。4.1.2 管道线$ls-ltempfile$wc-lerr|mailboberr$rmno_exist|echo“removefileerror!”占据终端显示的进程叫作占据终端显示的进程叫作“前台进程前台进程”;不占据终端显示的则叫作不占据终端显示的则叫作“后台进程后台进程”。一个终端可以同时运行一个前台进程和多个后台进程。一个终端可以同时运行一个前台进程和多个后台进程。4.1.3后台进程后台进程$mansh|lp&1 1557$kill-9$!后台命令(或程序)以符号后台命令(或程序)以符号“&”结束,结束,将立即返回将立即返回Shell提示符,同时在后台执行该命令。提示符,同时在后台执行该命令。有些字符是对于有些字符是对于Shell有特殊意义的字符,常用于控制文件名的有特殊意义的字符,常用于控制文件名的组成,还用于构成组成,还用于构成Unix中广泛应用的正则表达式。中广泛应用的正则表达式。4.1.4通配符及特殊字符通配符及特殊字符*匹配任意字符串,匹配任意字符串,0或多个字符或多个字符?匹配单个字符匹配单个字符abc匹配匹配a、b、c这组字符中的一个这组字符中的一个!abc匹配这组字符以外的某个字符匹配这组字符以外的某个字符a-z匹配在匹配在a到到z这个范围内的某个字符这个范围内的某个字符!a-z匹配不在匹配不在a到到z这个范围内的某个字符这个范围内的某个字符;分隔命令,标志命令结束,但不换行分隔命令,标志命令结束,但不换行&后台命令后台命令$变量的访问变量的访问()将小括号中所括的命令生成一个子将小括号中所括的命令生成一个子shell去执去执行行转义字符,它使紧跟其后的那个字符失去在转义字符,它使紧跟其后的那个字符失去在Shell中的特殊意义中的特殊意义$echo*$echo*特别要注意的是转义符的使用,分析以下命令的输特别要注意的是转义符的使用,分析以下命令的输出结果:出结果:$ls*abc file1 youx$echoHowareyou?How are youx$echoHowareyou?How are you?ShellShell允许通过编程来完成复杂的功能处理,允许通过编程来完成复杂的功能处理,与高级语言相比,具有以下特点:与高级语言相比,具有以下特点:ShellShell是解释性的,多数高级语言是编译性是解释性的,多数高级语言是编译性的;的;ShellShell语言与高级语言处理的对象不同;语言与高级语言处理的对象不同;ShellShell与系统有密切的关系;与系统有密切的关系;ShellShell易编写、调试、灵活性较强,但速度易编写、调试、灵活性较强,但速度低;低;ShellShell作为命令级语言,命令组合功能很强。作为命令级语言,命令组合功能很强。4.2Shell程序设计程序设计4.2.1Shell程序的设计与执行程序的设计与执行shell程序的功能是将命令序列组合并由系统自动执行。程序的功能是将命令序列组合并由系统自动执行。用用vi编辑器创建一个简单的编辑器创建一个简单的shell程序,内容如下:程序,内容如下:#!/bin/bashechohellowholsldate以以file.sh文件名存盘。文件名存盘。file.sh文件交给系统执行可用三种方式实现:文件交给系统执行可用三种方式实现:利用输入输出重定向:利用输入输出重定向:$shdatelogiftest-rerrorfilethencaterrorfiledatelogrmerrorfileelseecho“Noerrorthishour.”datelogfi例例3:#!/bin/sh#例例3根据一天中的不同钟点给出不同的问候消息根据一天中的不同钟点给出不同的问候消息hours=date|cut-c12-13if$hour-lt12thenecho“Goodmorning!”elseif$hour-lt18thenecho“Goodafternoon!”elseecho“Goodevening!”fifi2)case分支:实现多选一控制结构的另一种方法分支:实现多选一控制结构的另一种方法语法:语法:casewordinpattern1)pat1-list1;pattern2)pat2-list2;*)default-list;esac其中:其中:word将与各匹配模式比较,将与各匹配模式比较,“;”符表示匹配结束,符表示匹配结束,“*”号为通配符。号为通配符。#!/bin/shecho-n“Whichcolordoyoulike?”readcolorcase“$color”inBbl?)echoIfeeltheskyis$color;Ggree*)echo$colorisfortrees;red|orange)echo$colorisverywarm!;*)echoNosuchcoloras$color;esacecho“Outofcase”#addthisscripttothe.profilefileecho“selectaterminaltype:”catENDIT1)vt1202)AT3863)sunENDITreadchoicecase“$choice”in1)TERM=vt120exportTERM;2)TERM=AT386exportTERM;3)TERM=sunexportTERM;esacecho“TERMis$TERM.”4.2.5循环语句循环语句循环语句完成命令的重复执行循环语句完成命令的重复执行1)for循环循环,常用于循环次数确定的情况常用于循环次数确定的情况语法:语法:forvarinword1word2wordndocommandsdone当变量值在列表中,执行一次所有命令,使用变量名访问列表当变量值在列表中,执行一次所有命令,使用变量名访问列表中取值。中取值。in列表可选,如果不用它,则列表可选,如果不用它,则for循环使用脚本运行循环使用脚本运行的位置参数。的位置参数。for循环中可根据需要进行嵌套循环中可根据需要进行嵌套例例1:列出用户注册目录下的:列出用户注册目录下的cc和和work子目录中所有子目录中所有.c和和.h文件。文件。#!/bin/sh#显示显示.c和和.h文件文件cd$HOMEfordirinccworkdoecho“.in$dir.”cd$dirforfilein*.chdols-l$filedonecddone2)while循环循环以命令表的出口状态为判别条件,决定循环体中的命令以命令表的出口状态为判别条件,决定循环体中的命令是否执行。语法结构是否执行。语法结构:while条件表达式条件表达式docmdlistdone格式格式:until条件表达式条件表达式docmdlistdone3)until循环循环until与与while循环的差别在于:循环的差别在于:对于循环出口状态的判定采取不对于循环出口状态的判定采取不同的处理策略同的处理策略#!/bin/shwhile$#-gt0doecho$*shiftdone$./scriptnameabcdeabcdebcdecdedee#!/bin/shuntilwho|greplindadosleep10donetalklindadragonwings break命令命令break是是Shell的内部命令,用于在循环体中根据命令运行的的内部命令,用于在循环体中根据命令运行的返回条件,直接终止循环体内命令的执行。当执行返回条件,直接终止循环体内命令的执行。当执行break命令命令时,控制流从循环体中转移到时,控制流从循环体中转移到done之后的第一条命令上。之后的第一条命令上。continue命令命令continue也是也是Shell的内部命令,用于在循环体中根据命令运的内部命令,用于在循环体中根据命令运行的返回条件,直接进入下一次循环命令的执行。当执行行的返回条件,直接进入下一次循环命令的执行。当执行continue命令时,控制流直接转到本循环体中第一条命令上。命令时,控制流直接转到本循环体中第一条命令上。4.2.6改变循环改变循环whiletruedoecho“Areyoureadytomoveon?”readanswerif“$answer”=Y-o“$answer”=ythenbreakelse#commandsfidoneprint“Herewego”#!/bin/shfornameincatmaillistdoif“$name”=“richard”thencontinueelsemail$nameKERNELKERNEL自解压自解压内核初始化内核初始化内核启动内核启动(start_kernel函数,在函数,在linuxlinux内核源代码树的内核源代码树的/usr/src/linux/usr/src/linux/init/main.c中中)2.2.内核启动:创建内核启动:创建1 1进程并执行,由它创建若干内核线程(进程并执行,由它创建若干内核线程(kernel threadkernel thread),),然然后装入并执行程序后装入并执行程序/sbinsbin/init/init(变成一个用户进程)。此后,变成一个用户进程)。此后,init根据根据/etc/inittab配置文件配置文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等置网络等 对于对于Redhat来说,执行的顺序为:来说,执行的顺序为:/etc/rc.d/rc.sysinit#由由init执行的第一个脚本执行的第一个脚本/etc/rc.d/rc$RUNLEVEL#$RUNLEVEL为缺省的运行模式为缺省的运行模式/etc/rc.d/rc.local#运行模式运行模式2、3、5时会运行的脚本时会运行的脚本/sbin/mingetty(或(或getty)#等待用户登录等待用户登录1.1./etc/etc/inittabinittab中指定了系统的运行级别(中指定了系统的运行级别(RUNLEVELRUNLEVEL),),initinit根据运行级别启根据运行级别启动相关的服务(一些后台进程),实现不同的功能。动相关的服务(一些后台进程),实现不同的功能。2.2.RUNLEVEL:RUNLEVEL:063.3.0:halt,1 1:单用户,单用户,2 2:多用户,:多用户,3 3:多用户并启动:多用户并启动NFSNFS服务服务4.4.4 4:保留,:保留,5 5:运行:运行xdm(Xwindow)以图形界面方式登录以图形界面方式登录5.5.6:reboot 运行级别运行级别运行级别目录运行级别目录(/etc/rcN.d)当前运行级别当前运行级别(runlevel)运行级别目录的文件格式运行级别目录的文件格式(SXXscript,KXXscript)inittab运行级别控制文件运行级别控制文件(/etc/inittab)修改修改inittab文件文件/etc/inittab的书写格式:的书写格式:Id:runlevels:action:process Id:惟一标志字段惟一标志字段,2-4个字符长个字符长runlevels:定义本行适用运行等级定义本行适用运行等级action:采取的行动采取的行动process:应该运行的进程应该运行的进程多个运行等级可以写在一起:多个运行等级可以写在一起:如:如:id:13:action:processarguments动作选项:动作选项:Respawn只要进程停止,该进程便重新启动只要进程停止,该进程便重新启动Wait进程运行一次,进程运行一次,init等待到它停止等待到它停止Once进程运行一次进程运行一次Boot系统引导过程中,进程运行系统引导过程中,进程运行,忽略等级忽略等级Bootwait系统引导过程中,进程运行,系统引导过程中,进程运行,init等待结束等待结束Off无任何行动无任何行动initdefault系统默认运行等级系统默认运行等级sysinit系统引导则运行系统引导则运行,优先于优先于boot或或bootwaitpowerfail电源故障后发送信号给电源故障后发送信号给init,init等待进程终止等待进程终止ctrlaltdel当当init收到收到SIGINT信号时该进程运行信号时该进程运行powerokwaitUPS恢复则向恢复则向init发送发送SIGINT信号信号inittab中:中:si:sysinit:/etc/rc.d/rc.sysinit,这个脚本优于其它进程运行这个脚本优于其它进程运行设置设置:主机名称,启动交换分区,检查文主机名称,启动交换分区,检查文件系统,装载内核模块等件系统,装载内核模块等/etc/rc.d/init.d/目录:保存所有运行目录:保存所有运行等级需要的所有脚本,功能:启动、停止、等级需要的所有脚本,功能:启动、停止、重启某些服务重启某些服务/etc/rc.d/rc脚本:使用脚本:使用start参数启动参数启动rcN.d中中S开头的脚本,以开头的脚本,以stop参数停止参数停止rcN.d中的以中的以K开头的脚本开头的脚本启动应用程序启动应用程序启动脚本分析启动脚本分析(start|stop|restart)例如查看:例如查看:$cat/etc/init.d/crond启动脚本启动脚本serviceserverstart|stop|restart|scriptnamestart|stop|restart|