1Shell脚本基础主讲:刘晓涛2创建和执行shell脚本使用echo命令显示消息创建变量使用本地和全局变量计算表达式使用if构造执行基于条件的shell脚本使用case构造执行基于条件的shell脚本识别用于执行重复任务的while、for、和until构造在shell脚本中使用break和continue语句控制进程的执行计算命令的开始到结束之间的时间议程3Shell图示4Shell脚本如果你有一系列经常使用的Linux命令,你可以把它们存储在一个文件中。Shell可以读取这个文件并执行其中的命令。这样的文件被称为脚本文件执行shell脚本要创建一个shell脚本,你要使用任何编辑器比如vi在文本文件中编写它为了使用bashshell来执行脚本magic,其命令是:$bashmagic或$./magic$为终端提示符(普通用户)概述5echo命令用于在屏幕上显示消息$echoThisisanexampleoftheechocommand这是echo命令的一个例子概述6#符号用于在shell脚本中可以包含注解入口echo“Hello”#Thisisacommentline.Thiswouldnotproduceanyoutputecho“world”这个例子中,第二行是一个注解的例子。它将被shell忽略,而且不产生任何消息概述7创建变量可以在任何时间通过简单的赋值来创建。语法variablename=valueLinux中的所有变量都被当作字符串。引用变量$符号用于引用一个变量的内容variable1=${variable2}变量8读入值给变量在执行shell脚本时,shell还允许用户从键盘中输入一个值给变量。可以使用read命令来做$readfname9局部变量当引用shell时,只有创建它的shell能够知道到变量的存在全局变量称为子shellshell中创建的变量局部于创建它的shell,除非使用export命令特别指出是全局的环境变量通过改变这些变量的值,用户能够定制此环境本地和全局Shell变量10环境变量(续)一些环境变量的例子是HOME,PATH,PS1,PS2,LOGNAME,SHLVL,及SHELLHOME变量Linux系统中的每个用户都有一个相关的称作HOME的目录当一个用户登录后,进入相应的HOME的目录$echo$HOME本地和全局Shell变量(续)11环境变量(续)PATH变量包含一列用冒号定界的目录的路径名字,便于可执行程序的搜索PS1变量PS1(PromptString1)变量包含了shell提示符,$符号$PS1=HELLOEnterHELLONewprompt本地和全局Shell变量(续)12环境变量(续)PS2变量是为第二个提示符设置值的环境变量LOGNAME变量包含用户的注册名字$echo“${LOGNAME}”SHLVL变量该变量包含你当前工作的shelllevel本地和全局Shell变量(续)13环境变量(续)SHELL变量环境变量存储了用户的缺省shellenv命令可用来查看所有的已移出的环境变量表和它们各自的值本地和全局Shell变量(续)14在单个命令行中使用多个命令的另一种方法(非Pipes)是通过命令替换echoThedateis`date`”expr命令用于求值算术表达式。该命令的输出被发送到标准输出$expr4+5将在屏幕上显示9命令替换15算术展开:你可以在$((…))中括一个表达式,用下面的命令来计算它的值:$((expression))命令替换(续)16编写一个shell脚本用于计算呼叫中心未应答的询问的数量。该脚本应该接收一天内所报告的询问的总数和应答的询问的数量,以便计算未应答的询问的数量。所有未应答的询问的总数=所有询问的总数-应答的询问的数量echoPleaseenterthetotalnumberofqueriesreportedtoday.readtotalqueriesechoPleaseenterthenumberofqueriesanswered.readansweredpending=$((totalqueries-answered))echoNumberofcallspending=$pending“chmod+xcallpendingExample117test和[]命令求值表达式,并返回true(0)或falseif构造Linuxshell提供了循环和判定的构造,可以在shell脚本中使用算术测试结合if构造,它可用于测试变量的数字值条件执行18串测试test命令也可用于字符串文件测试test命令也可用于检查文件的状态exit命令用于终止shell脚本的执行并返回到$提示符下条件执行(续)19test测试命令1-eq:等于则为真-ne:不等于则为真-gt:大于则为真-ge:大于等于则为真-lt:小于则为真-le:小于等于则为真数值测试20test测试命令2=:等于则为真!=:不相等则为真-z字符串:字符串长度为零则为真-n字符串:字符串长度不为零则为真字符串测试21test测试命令3-e文件名:如果文件存在则为真-r文件名:如果文件存在且可读则为真-w文件名:如果文件存在且可写则为真-x文件名:如果文件存在且可执行则为真-s文件名:如果文件存在且至少有一个字符则为真-d文件名:如果文件存在且为目录则为真-f文件名:如果文件存在且为普通文件则为真-c文件名:如果文件存在且为字符型特殊文件则为真-b文件名:如果文件存在且为块特殊文件则为真-a并且–o或者!非文件测试22#!/bin/bashechoEnterthepercentageofcallsansweredsameday.readactualif[$actual-le80]thenechoYourGradeisAverage.elif[$actual-gt80-a$actual-le90]thenechoYourGradeisGood.elseechoYourGradeisOutstanding.fiExample223shell脚本中使用的这个构造依据变量的值而执行一组特定指令当变量的值和其中一个指定的值相匹配时,就执行写在该值下的一组命令case…esac构造24#!/bin/bashechoListofServicesOfferedbyDiazTelecommunicationsecho1)GlobalRoamecho2)V-mailecho3)MailonMoveecho4)Caller-IDecho5)DialaPizzaecho–nSelecttheserviceforwhichyouneedmoreinformation[1-5]:readchoicecase$choicein1)echoYoujustneedonecell-phonenumberwhereveryoutravelacrosstheworld.;;2)echoYoucanrecordyourmessageswhenyouarenotabletotakeacall.;;3)echoYoucanreceivee-mailmessagesonyourcell-phone.;;4)echoYoucandisplaythecallerstelephonenumberonyourhandsetscreenwheneveryoureceiveacallsothatyouknowwho'scalling.;;5)echoYoucanorderforpizzafromyourcell-phone.;;*)echoYouhaveselectedaninvalidoption.;;esacExample325while构造while条件do命令(s)done只有条件为真时,就执行do和done之间的命令until构造until循环构造的求值模式于while循环相反。until循环将继续执行直到求值的条件为真。迭代26for构造forvariable_nameinlist_of_valuesdo…donefor循环取一列值作为输入并对循环中每个值执行循环break和continue命令break命令引起终止循环continue命令的使用将强迫一个新的重复迭代(续)27#!/bin/bashecode=1000while[$ecode-le1008]doechoEnterdatafortheemployeewithEmployeeCode=$ecodeecho-nEmployeeName:readnameecho-nEmailAddress:reademailecho-nTelephoneNumber:readtelnoecho$ecode:$name:$email:$telnoccemployee((ecode=$ecode+1))doneExample428请求后台处理用于请求后台进程的符号是(&)$wctempfile&[1]2082$vinewfile检查后台进程Ps(进程状态)命令为每个当前活动的每个进程产生一行入口。控制进程的执行29终止后台进程可用kill命令,如下所示$kill278查看完成一个命令所花的时间你可以使用time命令来查看一个命令从开始到结束所花的时间。$timefind/etc-namepasswd2/dev/null控制进程的执行(续)30垂直条(|)是管道字符它指示shell:‘|’前面的命令的输出作为‘|’之后命令的输入发送ls–l|more用管道组合命令,功能强大管道的介绍31创建和执行shell脚本使用echo命令显示消息创建变量使用本地和全局变量计算表达式使用if构造执行基于条件的shell脚本使用case构造执行基于条件的shell脚本识别用于执行重复任务的while、for、和until构造在shell脚本中使用break和continue语句控制进程的执行计算命令的开始到结束之间的时间小结