第八章编写Shell管理脚本(二)1如何为变量赋值?如何查看变量的值?在变量应用中,反撇号的用途是什么?变量$0、$1、$?分别表示什么含义?有哪些方式可以执行Shell脚本中的语句?2课程回顾熟悉条件测试的应用会使用if条件语句会使用for、while循环语句会使用case分支语句了解其他控制语句及函数的使用3技能展示4本章结构编写Shell管理脚本(二)使用if条件语句条件测试操作case语句if语句的结构until循环if语句应用示例使用for循环语句其他控制语句for语句的结构for语句应用示例while语句的结构while语句应用示例使用while循环语句循环控制语句shift语句函数的定义和调用Shell函数应用函数的参数传递test命令用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值格式:test条件表达式[条件表达式]常见的测试类型测试文件状态字符串比较整数值比较逻辑测试5条件测试操作测试文件状态格式:[操作符文件或目录]常用的测试操作符-d:测试是否为目录(Directory)-e:测试目录或文件是否存在(Exist)-f:测试是否为文件(File)-r:测试当前用户是否有权限读取(Read)-w:测试当前用户是否有权限写入(Write)-x:测试当前用户是否可执行(Excute)该文件-L:测试是否为符号连接(Link)文件6条件测试操作[root@localhost~]#[-d/etc/vsftpd][root@localhost~]#echo$?0[root@localhost~]#[-d/etc/hosts][root@localhost~]#echo$?1返回值为0,表示上一步测试的条件成立[root@localhost~]#[-e/media/cdrom]&&echoYESYES[root@localhost~]#[-e/media/cdrom/Server]&&echoYES“[root@localhost~]#如果测试的条件成立则输出“YES”整数值比较格式:[整数1操作符整数2]常用的测试操作符-eq:等于(Equal)-ne:不等于(NotEqual)-gt:大于(GreaterThan)-lt:小于(LesserThan)-le:小于或等于(LesserorEqual)-ge:大于或等于(GreaterorEqual)7条件测试操作[root@localhost~]#who|wc-l5[root@localhost~]#[`who|wc-l`-le10]&&echoYESYES[root@localhost~]#df-hT|grep/boot|awk'{print$6}'12%[root@localhost~]#BootUsage=`df-hT|grep/boot|awk'{print$6}'|cut-d%-f1`[root@localhost~]#echo$BootUsage12[root@localhost~]#[$BootUsage-gt95]&&echoYES如果登录用户数小于或等于10则输出YES如果/boot分区的磁盘使用率超过95%则输出YES字符串比较格式:[字符串1=字符串2][字符串1!=字符串2][-z字符串]常用的测试操作符=:字符串内容相同!=:字符串内容不同,!号表示相反的意思-z:字符串内容为空8条件测试操作[root@localhost~]#read-pLocation:FilePathLocation:/etc/inittab[root@localhost~]#[$FilePath=/etc/inittab]&&echoYESYES[root@localhost~]#[$LANG!=en.US]&&echo$LANGzh_CN.UTF-8如果键入路径与指定的目录一致则输出YES如果当前的语言环境不是en_US,则输出LANG变量的值逻辑测试格式:[表达式1]操作符[表达式2]...常用的测试操作符-a或&&:逻辑与,“而且”的意思前后两个表达式都成立时整个测试结果才为真,否则为假-o或||:逻辑或,“或者”的意思操作符两边至少一个为真时,结果为真,否则结果为假!:逻辑否当指定的条件不成立时,返回结果为真9条件测试操作[root@localhost~]#echo$USERroot[root@localhost~]#[$USER!=teacher]&&echoNotteacherNotteacher[root@localhost~]#[$USER=teacher]||echoNotteacherNotteacher如果发现用户不是teacher则提示:“Notteacher”与上一命令行效果相同当“条件成立”时执行相应的操作10if条件语句——单分支if条件测试命令then命令序列fiif磁盘已用空间80%then报警fiif条件测试命令命令序列…fi结束判断条件为真then条件为假应用示例:如果/boot分区的空间使用超过80%,输出报警信息11if条件语句——单分支#!/bin/bashRATE=`df-hT|grep/boot|awk'{print$6}'|cut-d%-f1`if[$RATE-gt80]thenechoWarning,DISKisfull!fi教员演示操作过程当“条件成立”、“条件不成立”时执行不同操作12if条件语句——双分支if条件测试命令then命令序列1else命令序列2fiif3306端口是否在监听状态thenmysqld服务已运行else启动mysqld服务fiif条件测试命令命令序列1…条件为真then命令序列2…条件为假elsefi结束判断应用示例:判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务13if条件语句——双分支#!/bin/bashservicemysqldstatus&/dev/nullif[$?-eq0]thenechomysqldserviceisrunning.else/etc/init.d/mysqldrestartfi相当于if语句嵌套,针对多个条件执行不同操作14if条件语句——多分支if条件测试命令1;then命令序列1elif条件测试命令2;then命令序列2elif...else命令序列nfiif条件测试命令1命令序列1…条件为真then命令序列n…条件为假elseelif条件测试命令2命令序列2…条件为真then…………fi结束判断请思考:如何判断/media/cdrom目录是否存在?提示用户输入一个整数,如何判断该值是否小于100?结合环境变量PWD,如何判断当前所在的工作目录是否为/usr/src?if语句结构有哪几种分支类型?语法格式分别是什么?15小结根据变量的不同取值,重复执行一组命令操作16for循环语句for变量名in取值列表do命令序列donefor收件人in邮件地址列表do发送邮件donefor变量=取值1取值1…取值ndone结束循环do命令序列…取值n已使用应用示例1:依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串17for循环语句[root@localhost~]#vishowday.sh#!/bin/bashforTMinMorningNoonEveningdoechoThe$TMoftheday.done[root@localhost~]#shshowday.shTheMorningoftheday.TheNoonoftheday.TheEveningoftheday验证脚本执行结果应用示例2:自动检测内网的几台服务器是否能ping通待检测服务器的地址由chkhosts.list文件给出每行一个IP地址18for循环语句#!/bin/bashforiin`catchkhosts.list`doping-c2$i&/dev/nullif[$?-eq0]thenechoHost$iisalive.elseechoHost$iisdead.fidone通过变量替换获取待检测的IP地址列表若能ping通,提示…alive若不能ping通,提示…dead重复测试指定的条件,只要条件成立则反复执行对应的命令操作19while循环语句while命令或表达式do命令列表donewhile可用内存100MBdo获取可用内存数donewhile条件测试命令条件为真条件为假done结束循环do命令序列…应用示例1:批量添加20个系统用户帐号,用户名依次为“stu1”、“stu2”、……、“stu20”这些用户的初始密码均设置为“123456”20while循环语句#!/bin/bashi=1while[$i-le20]douseraddstu$iecho123456|passwd--stdinstu$i&/dev/nulli=`expr$i+1`done执行leti++也可以使变量i的值递增1应用示例2:批量删除上例中添加的20个系统用户帐号21while循环语句#!/bin/bashi=1while[$i-le20]douserdel-rstu$ii=`expr$i+1`done根据变量的不同取值,分别执行不同的命令操作22case多重分支语句case变量值in模式1)命令序列1;;模式2)命令序列2;;……*)默认执行的命令序列esaccase变量=模式1esac结束分支命令序列1…;;有变量=模式2变量=其他值(*)默认命令序列………无是否否命令序列2…;;有无是应用示例1:编写脚本文件mydb.sh,用于控制系统服务mysqld当执行./mydb.shstart时,启动mysqld服务当执行./mydb.shstop时,关闭mysqld服务如果输入其他脚本参数,则显示帮助信息23case多重分支语句#!/bin/bashcase$1instart)echoStartMySQLservice.;;stop)echoStopMySQLservice.;;*)echoUsage:$0start|stop;;esac应用示例2:提示用户从键盘输入一个字符,判断该字符是否为字母、数字或者其它字符,并输出相应的提示信息24case多重分支语句#!/bin/bashread-pPresssomekey,thenpressReturn:“KEYcase$KEY“in[a-z]|[A-Z])echoIt'saletter.;;[0-9])echoIt'sadigit.;;*)echoIt'sfunctionkeys、Spacebarorotherkeys.esacuntil语句根据条件执行重复操作25until循环语句until条件测试命令do命令序列doneuntil条件测试命令条件为假条件为真done结束循环do命令序列…用于迁移位置变量,将$1~$9依次向左传递例如,若当前脚本程序获得的位置变量如下:$1=file1、$2=file2、$3=file3、$4=file4则执行一次shift命令后,各位置变量为:$1=file2、$2=file3、$3=file4再次执行shift命令后,各位置变量为:$1=file3、$2=file426shift迁移语句应用示例:通过命令行参数传递多个整数值,并计算总和27shift迁移语句[root@localhost~]#visumer.sh#!/bin/bashResult=0while[$#-gt0]doResult=`expr$Result+$1`shiftdoneechoThesumis:$Result[root@localhost~]#./sumer.sh123456Thesumis:102验证脚本执行结果b