资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,BENET3.0,第二学期课程,第八章 编写,Shell,管理脚本(二),2,课程回顾,如何为变量赋值?如何查看变量的值?,在变量应用中,反撇号的用途是什么?,变量,$0,、,$1,、,$?,、,$,分别是什么含义?,有哪些方式可以执行,Shell,脚本中的语句?,3,技能展示,熟悉条件测试的应用,会使用,if,条件语句,会使用,for,、,while,循环语句,会使用,case,分支语句,了解其他控制语句及函数的使用,4,编写,Shell,管理脚本(二),本章结构,使用,if,条件语句,条件测试操作,case,语句,if,语句的结构,until,循环,if,语句应用示例,使用,for,循环语句,其他控制语句,for,语句的结构,for,语句应用示例,while,语句的结构,while,语句应用示例,使用,while,循环语句,循环控制语句,shift,语句,函数的定义和调用,Shell,函数应用,函数的参数传递,5,条件测试操作,test,命令,用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为,0,,否则为其他数值,格式:,test,条件表达式,条件表达式,常见的测试类型,测试文件状态,字符串比较,整数值比较,逻辑测试,6,条件测试操作,测试文件状态,格式:,操作符 文件或目录,常用的测试操作符,-d,:测试是否为目录(,Directory,),-e,:测试目录或文件是否存在(,Exist,),-f,:测试是否为文件(,File,),-r,:测试当前用户是否有权限读取(,Read,),-w,:测试当前用户是否有权限写入(,Write,),-x,:测试当前用户是否可执行(,Excute,)该文件,-L,:测试是否为符号连接(,Link,)文件,rootlocalhost #, -d /etc/vsftpd ,rootlocalhost # echo $?,0,rootlocalhost #, -d /etc/hosts ,rootlocalhost # echo $?,1,返回值为,0,,表示上一步测试的条件成立,rootlocalhost # -e /media/cdrom ,&,echo YES,YES,rootlocalhost # -e /media/cdrom/Server & echo YES“,rootlocalhost #,如果测试的条件成立则输出“,YES”,7,条件测试操作,整数值比较,格式:,整数,1,操作符 整数,2 ,常用的测试操作符,-eq,:等于(,Equal,),-ne,:不等于(,Not Equal,),-gt,:大于(,Greater Than,),-lt,:小于(,Lesser Than,),-le,:小于或等于(,Lesser or Equal,),-ge,:大于或等于(,Greater or Equal,),rootlocalhost # who | wc -l,5,rootlocalhost #, who | wc -l -le 10 ,& echo YES,YES,rootlocalhost # df -hT | grep /boot | awk print $6,12%,rootlocalhost # BootUsage=df -hT | grep /boot | awk print $6 | cut -d % -f 1,rootlocalhost # echo $BootUsage,12,rootlocalhost #, $BootUsage -gt 95 ,& echo YES,如果登录用户数小于或等于,10,则输出,YES,如果,/boot,分区的磁盘使用率超过,95%,则输出,YES,8,条件测试操作,字符串比较,格式:,字符串,1 =,字符串,2 ,字符串,1 !=,字符串,2 , -z,字符串,常用的测试操作符,=,:字符串内容相同,!=,:字符串内容不同,,!,号表示相反的意思,-z,:字符串内容为空,rootlocalhost # read -p Location,:, FilePath,Location,:,/etc/inittab,rootlocalhost #, $FilePath = /etc/inittab ,& echo YES,YES,rootlocalhost #, $LANG != en.US ,& echo $LANG,zh_CN.UTF-8,如果键入路径与指定的目录一致则输出,YES,如果当前的语言环境不是,en_US,,则输出,LANG,变量的值,9,条件测试操作,逻辑测试,格式:,表达式,1 ,操作符,表达式,2 .,常用的测试操作符,-a,或,&,:逻辑与,“而且”的意思,前后两个表达式都成立时整个测试结果才为真,否则为假,-o,或,|,:逻辑或,“或者”的意思,操作符两边至少一个为真时,结果为真,否则结果为假,!,:逻辑否,当指定的条件不成立时,返回结果为真,rootlocalhost # echo $USER,root,rootlocalhost # $USER != teacher ,&,echo Not teacher,Not teacher,rootlocalhost # $USER = teacher ,|,echo Not teacher,Not teacher,如果发现用户不是,teacher,则提示:“,Not teacher”,与上一命令行效果相同,10,if,条件,语句,单分支,当“条件成立”时执行相应的操作,if,条件测试命令,then,命令序列,fi,if,磁盘已用空间,80%,then,报警,fi,if,条件测试命令,命令序列,fi,结束判断,条件为真,then,条件为假,11,if,条件,语句,单分支,应用示例:,如果,/boot,分区的空间使用超过,80%,,输出报警信息,#!/bin/bash,RATE=df -hT | grep /boot | awk print $6 | cut -d % -f1 ,if, $RATE -gt 80 ,then,echo Warning,DISK is full!,fi,教员演示操作过程,12,if,条件,语句,双分支,当“条件成立”、“条件不成立”时执行不同操作,if,条件测试命令,then,命令序列,1,else,命令序列,2,fi,if,3306,端口是否在监听状态,then,mysqld,服务已运行,else,启动,mysqld,服务,fi,if,条件测试命令,命令序列,1,条件为真,then,命令序列,2,条件为假,else,fi,结束判断,13,if,条件,语句,双分支,应用示例:,判断,mysqld,是否在运行,若已运行则输出提示信息,否则重新启动,mysqld,服务,#!/bin/bash,service mysqld status & /dev/null,if, $? -eq 0 ,then,echo mysqld service is running.,else,/etc/init.d/mysqld restart,fi,教员演示操作过程,14,if,条件,语句,多分支,相当于,if,语句嵌套,针对多个条件执行不同操作,if,条件测试命令,1,;,then,命令序列,1,elif,条件测试命令,2,;,then,命令序列,2,elif .,else,命令序列,n,fi,if,条件测试命令,1,命令序列,1,条件为真,then,命令序列,n,条件为假,else,elif,条件测试命令,2,命令序列,2,条件为真,then,fi,结束判断,15,小结,请思考:,如何判断,/media/cdrom,目录是否存在?,提示用户输入一个整数,如何判断该值是否小于,100,?,结合环境变量,PWD,,如何判断当前所在的工作目录是否为,/usr/src,?,逻辑测试操作符,&,与,|,的区别是什么?,if,语句结构有哪几种分支类型?语法格式分别是什么?,16,for,循环语句,根据变量的不同取值,重复执行一组命令操作,for,变量名,in,取值列表,do,命令序列,done,for,收件人,in,邮件地址列表,do,发送邮件,done,for,变量,=,取值,1,取值,1,取值,n,done,结束循环,do,命令序列,取值,n,已使用,17,for,循环语句,应用示例,1,:,依次输出,3,条文字信息,包括一天中的“,Morning”,、“,Noon”,、“,Evening”,字串,rootlocalhost # vi showday.sh,#!/bin/bash,for,TM,in,Morning Noon Evening,do,echo The $TM of the day.,done,rootlocalhost # sh showday.sh,The,Morning,of the day.,The,Noon,of the day.,The,Evening,of the day,验证脚本执行结果,18,for,循环语句,应用示例,2,:,对于使用“,/bin/bash”,作为登录,Shell,的系统用户,检查他们在“,/opt”,目录中拥有的子目录或文件数量,如果超过,100,个,则列出具体个数及对应的用户帐号,#!/bin/bash,DIR=/opt,LMT=100,ValidUsers=grep /bin/bash /etc/passwd | cut -d : -f 1,for,UserName,in,$ValidUsers,do,Num=find $DIR -user $UserName | wc -l,if $Num -gt $LMT ; then,echo $UserName have $Num files.,fi,done,教员演示操作过程,获得使用,bash,作为登录,Shell,的用户名列表,19,while,循环语句,重复测试指定的条件,只要条件成立则反复执行对应的命令操作,while,命令或表达式,do,命令列表,done,while,可用内存, /dev/null,i=expr $i + 1,done,执行,let i+,也可以使变量,i,的值递增,1,教员演示操作过程,21,while,循环语句,应用示例,2,:,批量删除上例中添加的,20,个系统用户帐号,#!/bin/bash,i=1,while, $i -le 20 ,do,userdel -r stu$i,i=expr $i + 1,done,教员演示操作过程,22,case,多重分支语句,根据变量的不同取值,分别执行不同的命令操作,case,变量值,in,模式,1),命令序列,1,;,模式,2),命令序列,2,;,* ),默认执行的命令序列,esac,case,变量,=,模式,1,esac,结束分支,命令序列,1,;,有,变量,=,模式,2,变量,=,其他值,(*),默认命令序列,无,是,否,否,命令序列,2,;,有,无,是,23,case,多重分支语句,应用示例,1,:,编写脚本文件,mydb.sh,,用于控制系统服务,mysqld,当执行,./mydb.sh start,时,启动,mysqld,服务,当执行,./mydb.sh stop,时,关闭,mysqld,服务,如果输入其他脚本参数,则显示帮助信息,#!/bin/bash,case,$1,in,start),echo Start MySQL service.,;,stop),echo Stop MySQL service.,;,*),echo Usage,:,$0 start|stop,;,esac,24,case,多重分支语句,应用示例,2,:,提示用户从键盘输入一个字符,判断该字符是否为字母、数字或者其它字符,并输出相应的提示信息,#!/bin/bash,read -p Press some key, then press Return:“ KEY,case,$KEY“,in,a-z|A-Z),echo Its a letter.,;,0-9),echo Its a digit.,;,*),echo Its function keys,、,Spacebar or other keys. ,esac,教员演示操作过程,25,until,循环语句,until,语句根据条件执行重复操作,until,条件测试命令,do,命令序列,done,until,条件测试命令,条件为假,条件为真,done,结束循环,do,命令序列,26,shift,迁移语句,用于迁移位置变量,将,$1$9,依次向左传递,例如,若当前脚本程序获得的位置变量如下:,$1=file1,、,$2=file2,、,$3=file3,、,$4=file4,则执行一次,shift,命令后,各位置变量为:,$1=file2,、,$2=file3,、,$3=file4,再次执行,shift,命令后,各位置变量为:,$1=file3,、,$2=file4,27,shift,迁移语句,应用示例:,通过命令行参数传递多个整数值,并计算总和,rootlocalhost # vi showday.sh,#!/bin/bash,Result=0,while $# -gt 0 ,do,Result=expr $Result + $1,shift,done,echo The sum is : $Result,rootlocalhost # ./sumer.sh 12 34 56,The sum is : 102,验证脚本执行结果,28,while,命令,do,break,done,循环控制语句,break,语句,在,for,、,while,、,until,等循环语句中,用于跳出当前所在的循环体,执行循环体后的语句,通常在循环体中与条件语句一起使用,跳出循环,29,while,do,continue,done,循环控制语句,continue,在,for,、,while,、,until,等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环,通常在循环体中与条件语句一起使用,继续下次循环,30,Shell,函数应用,Shell,函数概述,在编写,Shell,脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数,合理使用,Shell,函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率,31,Shell,函数应用,定义新的函数,调用已定义的函数,向函数内传递参数,function,函数名,命令序列,函数名,() ,命令序列,或者,函数名,函数名 参数,1,参数,2 .,32,Shell,函数应用,应用示例:,在脚本中定义一个加法函数,用于计算,2,个整数的和,调用该函数计算(,12+34,)、(,56+789,)的和,#!/bin/bash,adder() ,echo expr $1 + $2,adder 12 34,adder 56 789,rootlocalhost # sh adderfun.sh,46,845,验证脚本执行结果,33,本章总结,编写,Shell,管理脚本(二),使用,if,条件语句,条件测试操作,case,语句,if,语句的结构,until,循环,if,语句应用示例,使用,for,循环语句,其他控制语句,for,语句的结构,for,语句应用示例,while,语句的结构,while,语句应用示例,使用,while,循环语句,循环控制语句,shift,语句,函数的定义和调用,Shell,函数应用,函数的参数传递,BENET3.0,第二学期课程,第八章 编写,Shell,管理脚本(二),上机部分,35,实验案例,1,:使用,Shell,脚本管理系统,需求描述,编写脚本程序用于监测系统服务,httpd,的运行状态,当服务状态失常时在“,/var/log/htmon.log”,文件中记入日志,自动将状态失常的,httpd,服务重新启动,若重启,httpd,服务失败,则尝试重新启动服务器主机,周一至周五期间每隔,15,分钟执行一次监测任务,编写脚本程序用于批量添加用户,提供交互,能根据提示指定添加用户的数量(少于,100,)、用户名前缀,并能设置帐号的失效时间、初始密码,用户名编号统一使用,2,位数,如使用“,01”,、“,02”,的形式,编写脚本批量删除用户,通过命令行参数指定要删除用户的名称前缀,删除以该前缀开头的所有用户,但要防止误删除,root,用户,36,实验案例,1,:使用,Shell,脚本管理系统,实现思路,编写,htmon.sh,脚本文件用于监测,httpd,服务状态,通过“,service httpd status”,命令的返回值判断服务状态,使用重定向符号“,”,追加记录日志,结合,crond,计划任务定期执行,编写,myuadd.sh,脚本用于批量添加用户帐号,使用,read,命令提示用户输入变量值进行交互,使用,while,语句循环执行添加用户的命令操作,使用,if,语句判断用户编号,小于,10,时自动在前缀后补“,0”,编写,myudel.sh,脚本用于批量删除用户帐号,通过位置参数“,$1”,传递要删除用户的名称前缀,结合“,grep -v root”,排除掉,root,用户,使用,for,循环批量删除符合条件的用户,37,实验案例,1,:使用,Shell,脚本管理系统,学员练习,60,分钟内完成,38,实验案例,2,:编写系统服务控制脚本,需求描述,为已安装的,zebra,程序编写,zebrad,服务控制脚本,启动服务:,/etc/init.d/zebrad start,终止服务:,/etc/init.d/zebrad start,重启服务:,/etc/init.d/zebrad restart,查看服务状态:,/etc/init.d/zebrad status,未正确指定“,start”,、“,stop”,、“,restart”,、“,status”,参数时,输出用法帮助信息后退出,在启动、终止服务时应显示相关提示信息,将,zebrad,添加为系统服务,39,实验案例,2,:编写系统服务控制脚本,实现思路,参考已有的系统脚本建立,zebrad,脚本文件,将启动、终止,zebra,程序等执行操作分别定义为函数,通过“,/usr/local/sbin/zebra -d”,命令启动,zebra,服务,结合“,/var/run/zebra.pid”,文件中的,PID,号终止,zebra,进程,通过判断“,zebra -d”,进程信息确定,zebra,服务状态,设置,case,分支语句,读取执行脚本时提供的未知参数“,$1”,,并进行比较,若为“,start”,、“,stop”,等字串,分别调用对应函数,否则执行默认操作,显示用法帮助信息并退出,执行“,chkconfig -add zebrad”,添加为系统服务,40,实验案例,2,:编写系统服务控制脚本,学员练习,20,分钟内完成,41,
展开阅读全文