岐山| 靖边| 丰城| 沙圪堵| 隆尧| 青田| 秦安| 乐都| 逊克| 双阳| 新竹县| 闽侯| 武当山| 社旗| 金佛山| 灵丘| 祁连| 邹平| 通城| 琼海| 顺德| 中江| 高平| 景谷| 台南市| 翠峦| 陵川| 同安| 永城| 黄岩| 惠东| 都江堰| 凤庆| 舞阳| 方山| 西宁| 丹寨| 姜堰| 谷城| 德清| 安福| 仲巴| 集贤| 乌兰浩特| 安岳| 古丈| 揭东| 临江| 龙岩| 和林格尔| 湘潭县| 凤冈| 芜湖市| 公主岭| 华阴| 沛县| 团风| 黄岛| 连云区| 新绛| 乾安| 汉口| 崇信| 龙里| 英吉沙| 阳春| 宽甸| 安西| 红河| 潞城| 将乐| 潮阳| 即墨| 凭祥| 盘山| 阳山| 磴口| 古丈| 犍为| 黔江| 平阴| 临桂| 津市| 兴隆| 金沙| 铜梁| 怀仁| 金门| 旌德| 图木舒克| 怀集| 昭通| 牟平| 郴州| 祁阳| 卓尼| 漯河| 渑池| 彭山| 平房| 苗栗| 府谷| 甘南| 梅县| 潮南| 灵石| 松江| 小河| 芜湖县| 吉水| 栖霞| 富蕴| 元谋| 彭州| 光山| 安平| 晋中| 芜湖县| 马关| 民丰| 铜梁| 繁昌| 颍上| 志丹| 商都| 茂港| 西藏| 布拖| 靖远| 班戈| 周至| 清丰| 吉水| 和政| 双桥| 保德| 仁怀| 西昌| 平湖| 青县| 闵行| 内蒙古| 仪陇| 姚安| 柳河| 灌云| 新乐| 新宁| 丹东| 崇阳| 东安| 宝清| 铜陵县| 新津| 合阳| 新洲| 牟定| 叙永| 巴林右旗| 丹棱| 襄汾| 台湾| 墨竹工卡| 繁昌| 威海| 潞西| 神池| 扎鲁特旗| 元阳| 常山| 湖北| 大竹| 绩溪| 武冈| 陵川| 新荣| 惠民| 灞桥| 梁平| 鹤壁| 祁阳| 科尔沁右翼中旗| 仁布| 济南| 榆社| 巨野| 五河| 汾阳| 乐都| 屏南| 石景山| 丹凤| 会东| 攸县| 班戈| 苏州| 济宁| 荥经| 加查| 饶阳| 扬州| 保定| 阿合奇| 建德| 波密| 融安| 龙里| 宿州| 泸西| 台南县| 甘德| 关岭| 镇沅| 阜平| 永胜| 竹山| 孟连| 陈巴尔虎旗| 武定| 澄迈| 碾子山| 达尔罕茂明安联合旗| 黄梅| 房山| 潮南| 沅陵| 化州| 兴安| 沭阳| 盖州| 东乡| 横峰| 黄龙| 鼎湖| 秭归| 嘉义市| 华宁| 大兴| 上虞| 铜川| 尖扎| 京山| 邵阳市| 四川| 冕宁| 井冈山| 靖安| 宣恩| 贡山| 务川| 房县| 库伦旗| 忻州| 新邵| 融安| 蒙自| 衡东| 图木舒克| 宜宾县| 衢州| 潞城| 眉山| 恭城| 安达|

玛雅吧彩票游戏时时彩:

2018-11-13 02:55 来源:甘肃新闻网

  玛雅吧彩票游戏时时彩:

  高排放车整治成重中之重此前北京清洁空气行动计划一直突出几大重点治理领域,包括压减燃煤、控车减油、清洁降尘等。321中国创业节是由一系列大型创业盛典组成的节日,是创业者自己的嘉年华,每年从3月开始,逐步在全国各地多城联动,落地各种有趣丰富的主题论坛、大咖讲座、行业沙龙、培训分享等。

同时,今年还将制订北京冬奥会和冬残奥会门票计划。自2008年起,石井就被新安县确定为旅游特色乡镇。

  同时,今年还将制订北京冬奥会和冬残奥会门票计划。张杰介绍,中耳炎引起的轻中度听力下降较为多见,分泌性中耳炎引起的听力障碍多数是可逆的,通过一定的治疗可以扭转。

  要充分依托资源禀赋,做好全域规划,推动农业二产化、三产化,通过加强宣传推介形成新优势、开拓新市场。浦东新区科学技术委员会主任唐石青在总结时说道,重大科学基础设施、国家级大科学项目落户张江,将大幅度提升张江、浦东乃至整个上海的科学研发水平和自主创新能力,促进技术创新、产业升级;张江综合性国家科学中心建设,将形成高尖端资源集聚、创新领军人才汇集的独特优势,成为国家参与国际重要科学领域前沿竞争的主要阵地。

其实我是个清醒的现实主义者。

  释疑2移动端绑定备案要面签吗?申请绑定非本人名下机动车无面签限制要求,通过相关平台可自助办理办理非本人名下机动车绑定有线上和线下两种途径,通过交管12123手机APP进行线上办理时,无面签限制要求。

  党的十八大以来,凡涉及重大立法事项如修改立法法、制定民法总则等,全国人大常委会都以党组名义向中央报送请示,形成了立法工作重大立法项目和重大问题向党中央请示报告的常态化、制度化机制。(编辑袁一泓徐炜旋)

  新京报:今年及未来冬奥特许商品的开发还有哪些值得期待的地方?短期内有什么看点?朴学东:2018年7月,北京冬奥组委将正式启动特许经营计划,我们将认真研究、充分吸收试运行阶段各界提出的意见建议,努力把特许经营的正式运行工作做好,为消费者提供更多、更美、更有收藏价值的特许商品,还会用适当的方式持续征集大家的创意,丰富产品设计,提升服务水平。

  创维碰到智能大潮,然后一呼百应,这里的百就是百度,期待创维和百度,共同探索与开创人工智能领域崭新的时代。三是完善重大立法事项向党中央报告制度。

  硬件配置上,KeepK1跑步机一点也不简单。

  值得关注的是,今年将开展生态环保大数据工程系统建设,组织开展家用高效油烟净化等技术的筛选和示范推广。

  三是完善重大立法事项向党中央报告制度。68岁的赵朝群是城关镇赵沟村的一名五保老人,在敬老院已经生活了十多年,看他身体硬朗,敬老院安排他担任门卫和消防员职务。

  

  玛雅吧彩票游戏时时彩:

 
责编:
关闭

关闭

关闭

封号提示

内容

首页 Linux-应用基础教程--CH10-Shell脚本编程

Linux-应用基础教程--CH10-Shell脚本编程.pptx

Linux-应用基础教程--CH10-Shell脚本编程

烟雨梦兮 2018-11-13 评分 0 浏览量 0 0 0 0 暂无简介 简介 举报
张杰强调,除先天性失聪外,中耳炎是引发宝宝听力减退的重要原因。

简介:本文档为《Linux-应用基础教程--CH10-Shell脚本编程pptx》,可适用于IT/计算机领域,主题内容包含第章bash脚本编程主讲人:梁如军本章内容要点Shell脚本的编制、执行和调试Shell脚本的成分和编码规范Shell变量替换扩展、数值计算、输入输符等。

第章bash脚本编程主讲人:梁如军本章内容要点Shell脚本的编制、执行和调试Shell脚本的成分和编码规范Shell变量替换扩展、数值计算、输入输出变量分类位置参数变量和特殊参数变量条件测试(文件测试、字符串测试、整数测试)分支流程控制(if、case)循环流程控制(for、while、until、select)函数的定义和调用、返回值使用循环分析命令行参数年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)本章学习目标熟悉Shell脚本的编码规范掌握执行和调试方法掌握对变量进行整数运算和间接引用的方法理解位置参数变量和特殊参数变量的用途掌握条件测试的使用、、(())掌握各种流程控制语句的使用if、casefor、while、until、select、break、continue掌握函数的定义、调用和传递返回值的方法掌握命令行参数、位置参数的操作(shift、getopts)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)Shell编程基础年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)Shell脚本和Shell编程当命令不在命令行中执行而是从一个文件中执行时该文件就称为Shell脚本。Shell脚本是纯文本文件。Shell脚本通常以sh作为后缀名但不是必须。Shell脚本是以行为单位的在执行脚本的时候会分解成一行一行依次执行。Shell是一种功能强大的解释型编程语言通常用于完成特定的、较复杂的系统管理任务Shell脚本语言非常擅长处理文本类型的数据年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)Shell脚本的成分程序元素保留字、运算符、表达式变量、数组、输入输出控制结构(顺序、分支、循环、子程序调用)Shell功能【参见第、章内容】执行命令(内置命令、外部命令、自编程序)重定向、管道、命令替换、命令聚合通配符、注释符、……Shell环境年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)Shell脚本的建立与执行Shell脚本的建立使用文本编辑器编辑脚本文件$viscriptfile为脚本文件添加可执rname:"etcpasswd>devthen:elseecho"$usernameisnotauseronthissystem"exitfiuntilwho|grep"$username">devdoecho"$usernameisnotloggedon"sleepdoneshiftmsg=$*X"$msg"=="X"msg="Hello,$username"echo"$msg"|write$usernamewhileuntilfor循环举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:whileuntilforsumsh#使用当型循环求sum()((i=,s=))#i=s=while((i<))do((i,s=i))doneechosum()=$s#使用直到型循环求sum()((i=,s=))until((i==))do((i,s=i))doneechosum()=$s#使用C风格的for循环求sum()for((s=,i=i<=s=i,i))do:doneechosum()=$swhileuntilfor循环举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:whileinfiniteloopsshwhiletruedosleepecho"infiniteloopshitCTRLCtostop"done#!binbash##filename:untilinfiniteloopsshuntilfalsedosleepecho"infiniteloopshitCTRLCtostop"done#!binbash##filename:forinfiniteloopsshfor(())dosleepecho"infiniteloopshitCTRLCtostop"done  在循环体内使用带有条件判断的break语句可以实现“永真循环条件退出”。将循环结果通过管道传递给其他命令处理(done|)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:looptopipeshforiindoecho$idone|sortnawkF':''$>={print$}'etcpasswd|whileIFS=readrpersondoecho$persondone|sort后台执行循环(done)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:loopinbackgroundshforpersoninBrownJiffJohnStonedomails"Test"$person<"Hello$person"doneawkF':''$>={print$}'etcpasswd|whileIFS=readrpersondomails"Test"$person<<ENDHello$person,Thismessageisfrom$(hostnamef)$USER$(dateF)ENDdone循环与菜单一般地使用while循环配合case实现Bash提供了专门的select循环select循环主要用于创建菜单select是个无限循环通常要配合case语句处理不同的选单及退出select循环的退出按ctrlc退出循环在循环体内用break命令退出循环或用exit命令终止脚本年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)使用while循环实现菜单年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:whatlangdoyoulikewhileshwhiletruedoecho"======ScriptingLanguage======"echo")bash"echo")perl"echo")python"echo")ruby"echo")Idonotknow!(Quit)"read–p"Whatisyourpreferredscriptinglanguage"langcase$langin)echo"Youselectedbash")echo"Youselectedperl")echo"Youselectedpython")echo"Youselectedruby")exitesacdonehttp:bashcybercitibizdecisionmakingmenudrivenshellscript循环结构select语法按数值顺序排列的菜单项(listitem)会显示到标准错误菜单项的间隔符由环境变量IFS决定用于引导用户输入的提示信息存放在环境变量PS中用户输入的值会被存储在内置变量RELAY中用户直接输入回车将重新显示菜单与for循环类似省略inlist时等价于in“$*”年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)selectvariableinlistdo#循环开始的标志commands#循环变量每取一次值循环体就执行一遍done#循环结束的标志循环结构select举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:whatlangdoyoulikeselectshclearPS="Whatisyourpreferredscriptinglanguage"selectsinbashperlpythonrubyquitdocase$sinbash|perl|python|ruby)echo"Youselected$s"quit)exit*)echo"Youselectederror,retry…"esacdone循环结构select举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:whatosdoyoulikeselectshclearPS="WhatisyourpreferredOS"IFS='|'os="Linux|GnuHurd|FreeBSD|MacOSX"selectsin$osdocase$REPLYin|||)echo"Youselected$s"*)exitesacdone循环结构select举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:rootbinxtop##filename:whatcmddoyouwantselectshPS="Selectaprogramyouwanttoexecute:"TOPLIST="tophtopatopnettopjnettopiftopftopiotopmytopinnotopdnstopapachetop"clearselectprogin$TOPLISTquitdo$prog==quitexitrpmq$prog>dev$prog||echo"$progisnotinstalled"done)top)nettopRPMFPRGE)ftopEPEL)innotopEPEL)htopEPEL)jnettopEPEL)iotopEPEL)dnstopRPMFPRGE)atopEPEL)iftopEPEL)mytopEPEL)apachetopEPEL位置参数和命令行参数处理年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)http:wikibashhackersorgscriptingposparamshttp:wikibashhackersorghowtogetoptstutorialhttp:aplawrencecomUnixgetoptshtmlhttp:milochenwordpresscomfastunderstandhowtousebashgetopts参数处理概述在脚本中经常使用流程控制处理位置参数循环结构:while、for多分支结构:case在脚本中经常使用如下命令配合位置参数处理shiftgetopts年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)位置参数的遍历()年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:pptraversesh#Usage:pptraversesharguments#echo"Thenameofthisscriptis:`basename$`"echo"Theargumentsare:$*"echo"Thenumberofargumentsis:$#"foridoecho"$i"donenum=foridoecho"The${num}thargumentis:$i"((num))done位置参数的遍历()年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:pptraversesh#Thisscriptistotestcommandlinearguments#Usage:pptraversesharguments#echo"usingthefirstkindofmethod"num=while$numle$#do#evalpara=$$num#echo"The${num}thargumentis:$para"echo"The${num}thargumentis:${!num}"letnum=numdoneecho"usingthesecondkindofmethod"for((num=num<=$#num))doecho"The${num}thargumentis:${!num}"done位置参数的遍历()年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:pptraverseshiftwhilesh#Usage:pptraverseshiftwhilesharguments#echo"usingwhilelooptotraversepositionalparameter"#while"$"do#echo"$"#shift#donenum=while"$"doecho"The${num}thargumentis:$"letnum=numshiftdone位置参数的遍历()年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:pptraverseshiftuntilsh#Usage:pptraverseshiftuntilsharguments#echo"usinguntillooptotraversepositionalparameter"#untilz"$"do#echo"$"#shift#donenum=untilz"$"doecho"The${num}thargumentis:$"((num))shiftdone位置参数的遍历()年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:pptraverseshiftforsh#Usage:pptraverseshiftforsharguments#echo"usingforlooptotraversepositionalparameter"#for(())do#n"$"echo"$"||break#shift#donefor((num=num))don"$"echo"The${num}thargumentis:$"||breakshiftdone位置参数处理举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:renif$#ltthencat<<HELPFUNCTION:RenamesanumberoffilesusingsedregularexpressionsUSAGE:$'<regexp>''<replacement>'<files>EXAMPLE:Renameall*HTMfilesto*html:$'HTM$''html'*HTMHELPexitfiOLD="$"NEW="$"shiftshift#$*containsnowallthefilesforfilein$*doiff"$file"thennewfile=`echo"$file"|sed"s${OLD}${NEW}g"`iff"$newfile"thenecho"ERROR:$newfileexistsalready"elseecho"Renaming$fileto$newfile"mv"$file""$newfile"fifidone选项和参数z是个选项(option)以减号开始的单字符c也是个选项etcmybackupconf是该选项的附加参数(additionalargument)r和v也是选项且不带附加参数footxt和mydir是脚本的处理对象他们是不与任何选项相关的参数在POSIX标准中称其为“操作对象数”(operands)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)mybackupzcetcmybackupconfrvfootxtmydir处理选项和参数按照Linux的命令行书写规范如下命令行也可以写成如下的等价形式用户使用自己的代码分析这些选项将变得十分困难Shell的内置命令getopts可以识别所有常见的选项格式为用户处理选项和参数提供了方便年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)mybackupzcetcmybackupconfrvfootxtmydirmybackupzrcetcmybackupconfvfootxtmydirmybackupzvcetcmybackupconfrfootxtmydirmybackupvrcetcmybackupconfzfootxtmydirmybackupvzcetcmybackupconfrfootxtmydirmybackupzrvcetcmybackupconffootxtmydirmybackupzrvcetcmybackupconffootxtmydir内置命令getoptsOPTSTRING是由若干有效的选项标识符组成的选项字符串若某选项标识符后有冒号则表示此选项有附加参数若整个字符串前有冒号将使用“安静”的错误模式VARNAME:每次匹配成功的选项保存在变量中ARGS:参数列表省略时为”$”年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)getoptsOPTSTRINGVARNAMEARGSgetoptsc:zrvoptgetopts:c:zrvoptgetopts的执行过程通常需要以循环的方式执行多次getopts来解析位置参数中的选项以及可能存在的选项附加参数每次调用getopts将会处理参数列表中的“下一个”选项将选项存储在VARNAME变量中将此选项对应的附加参数存储在环境变量OPTARG中对环境变量OPTIND进行自增操作使$OPTIND总是指向原始参数列表中“下一个”要处理的元素位置若$VARNAME与$OPTSTRING的所有选项均不匹配则做“invalidoption”的错误设置若某选项的参数不存在则做“requiredargumentnotfound”的错误设置年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)OPTERR:默认OPTERR=。如果OPTERR=,shell将禁用“错误提示输出”即使选项字符串的开头不是冒号。getopts的错误报告模式冗余(Verbose)模式(OPTSTRING不以:开头)“invalidoption”VARNAME=“”unsetOPTARG“requiredargumentnotfound”VARNAME=“”unsetOPTARG并输出错误信息安静(Silent)模式(OPTSTRING以:开头)“invalidoption”VARNAME=“”OPTARG=‘无效的选项字符’“requiredargumentnotfound”VARNAME=“:”OPTARG=‘与参数对应的选项字符’年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)while循环与getopts处理getopts返回假时终止while循环当getopts遭遇到第一个非选项参数时终止解析当getopts遭遇到“”参数时终止解析年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)whilegetoptsOPTSTRINGVARNAMEdocase$VARNAMEin…)……………)…………:)…………)…………esacdonegetopts的注意事项getopts不能解析GNUstyle长参数(myoption)getopts从不改变原始位置参数若希望移动位置参数需手工执行shiftgetopts会自动对变量OPTIND做自增处理OPTIDX的初始值为若要重新解析命令行参数需将OPTIDX的值置为getopts遭遇到第一个非选项参数时终止解析终止解析后执行命令shift((OPTIND))可以使”$”只包含“操作对象数”(operands)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)getopts举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:ppparsegetoptsshwhilegetopts"abc:def:ghi"flagdoecho"$flag"$OPTIND$OPTARGdoneecho"Resetting"OPTIND=whilegetopts"bc:def:ghi"flagdoecho"$flag"$OPTIND$OPTARGdone$ppparsegetoptsshabcfoof"foobar"h–gde$ppparsegetoptsshabf"foobar"hgde–c$ppparsegetoptsshabf“foobar”h–cgdegetopts举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:ppparsegetoptsshwhilegetopts":abc:def:ghi"flagdoecho"$flag"$OPTIND$OPTARGdoneecho"Resetting"OPTIND=whilegetopts":bc:def:ghi"flagdoecho"$flag"$OPTIND$OPTARGdone$ppparsegetoptsshabcfoof"foobar"hgde$ppparsegetoptsshabf"foobar"hgde–c$ppparsegetoptsshabf“foobar”h–cgdegetopts举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:mybackupgetoptsshwhilegetopts:zc:x:rvoptdocase$optinc)ConfFile=$OPTARGx)ExcludeFile=$OPTARGz)Compress=truer)Recursive=truev)Verbose=true:)echo"$:Mustsupplyanargumentto$OPTARG">exit)echo"Invalidoption$OPTARGignored">esacdoneshift$((OPTIND))echo$echo"$"getopts举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:mybackupgetoptsshwhilegetopts:zc:x:rvoptdocase$optinc)if$OPTARG=*then((OPTIND))continuefiConfFile=$OPTARGx)ExcludeFile=$OPTARGz)Compress=truer)Recursive=truev)Verbose=true:)echo"$:Mustsupplyanargumentto$OPTARG">exit)echo"Invalidoption$OPTARGignored">esacdoneshift((OPTIND))echo$echo"$"函数年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)Shell函数简介为了避免大型脚本变得复杂、晦涩而使用函数将大型脚本代码分割成小块将这些被命名的代码块称为函数一个函数就是一个子程序用于完成特定的任务如:添加一个用户、判断用户是否为管理员等函数定义之后可以被使用它的主程序调用调用函数的方法与执行Shell命令无异可以在Shell脚本中调用(函数需先定义而后调用)在命令行上直接调用(定义函数的文件需先加载)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)Shell的函数在其他语言中也被称为:过程(procedure)方法(method)subroutine(子程序)routine(例行程序)合理使用Shell函数简化程序代码实现代码重用实现一次定义多次调用。如:isrootuser()函数可以由不同的shell脚本重复使用。实现结构化编程使脚本内容更加简洁增强程序的易读性提高执行效率将常用的功能定义为多个函数并将其保存在一个文件中类似其他语言的“模块”文件在~bashrc或命令行上使用source命令调用这个文件此文件中定义的多个函数一次性地调入内存从而加快运行速度年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)函数的定义和调用函数定义函数调用只需输入函数名即可调用函数函数必须在调用之前定义年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)function函数名{commands}函数名(){commands}函数名函数名参数参数函数的存储和显示函数的存储函数和调用它的主程序保存在同一个文件中函数的定义必须出现在调用之前函数和调用它的主程序保存在不同的文件中保存函数的文件必须先使用source命令执行之后才能调用其中的函数函数的显示显示当前Shell可见的所有函数名$declareF显示当前Shell可见的所有(指定)的函数定义$declaref$declaref<functionName>年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)函数的定义和调用举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:allinonebackupselectsh###UserdefineFunction(UDF)###sqlbak(){echo"Runningmysqldumptool"}syncbak(){echo"Runningrsynctool"}gitbak(){echo"Runninggistoretool"}tarbak(){echo"Runningtartool"}###Mainscriptstartshere###PS="Pleasechooseabackuptools:"selectsinmysqldumprsyncgistoretarquitdocase$REPLYin)sqlbak)syncbak)gitbak)tarbak)exitesacdone函数的定义和调用举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:rootbinmybackupfunctionssh###UserdefineFunction(UDF)###sqlbak(){echo"Runningmysqldumptool"}syncbak(){echo"Runningrsynctool"}gitbak(){echo"Runninggistoretool"}tarbak(){echo"Runningtartool"}#!binbash##filename:allinonebackupselectsourcefuncshsourcerootbinmybackupfunctionssh###Mainscriptstartshere###PS="Pleasechooseabackuptools:"selectsinmysqldumprsyncgistoretarquitdocase$REPLYin|mMysqldump)sqlbak|rRsync)syncbak|gGistore)gitbak|tTar)tarbak)exitesacdone函数与变量参数(Arguments)调用函数时使用位置参数的形式为函数传递参数函数内的$${n}、$*和$表示其接收的参数函数调用结束后位置参数$${n}、$*和$将被重置为调用函数之前的值在主程序和函数中$始终代表脚本名变量(Variables)函数内使用local声明的变量是局部(Local)变量局部变量的作用域是当前函数以及其调用的所有函数函数内未使用local声明的变量是全局(Global)变量即主程序和函数中的同名变量是一个变量(地址一致)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)函数与位置参数举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:ppandfunctionshecho"===Printpositionalparametersinmain:"echo"$:$*"pp(){echo'fPrint$*parametersinfun:'echo"$:$*"}pp(){echo'fPrint$*parametersinfun:'echo"$:$*"ppstndthththththththecho'fPrint$*parametersinfun:'echo"$:$*"}ppecho"===Printpositionalparametersinmain:"echo"$:$*"ppIIIIIIIVVVIVIIVIIIIXppandfunctionshabcdefghi函数与位置参数举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:functionmaxsh#UserdefineFunction(UDF)usage(){echo"ListtheMAXofthepositiveintegersincommandline"echo"Usage:`basename$`<num><num><num>"exit}max(){z$||z$usagelargest=forido((i>largest))largest=$idone}###Mainscriptstartshere###max"$"echo"Thelargestofthenumbersis$largest"functionmaxsh由于largest变量在函数max内没有使用local声明所以它是全局的函数的结束与返回值当函数的最后一条命令执行结束函数即结束函数的返回值就是最后一条命令的退出码其返回值被保存在系统变量$中可以使用return或exit显式地结束函数returnNreturn将结束函数的执行可以使用N指定函数返回值exitNexit将中断当前函数及当前Shell的执行可以使用N指定返回值年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)http:maillinuxiepipermaililugMarchhtmlhttp:wwwlinuxjournalcomcontentreturnvaluesbashfunctions函数的结束与返回值举例年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:functionmaxsh#UserdefineFunction(UDF)max(){ifz$||z$thenecho"Needparameterstothefunction"exitfi$eq${echo"Thetwonumbersareequal"exit}(($>$))return$||return$}###Mainscriptstartshere###readp"Pleaseinputtwointegernumbers:"nnecho"n=$n,n=$n“max$n$nreturnval=$echo"Thelargerofthetwonumbersis$returnval"函数返回值(续)使用全局变量引用函数的值不利于结构化编程使用return或exit只能返回整数值使用标准输出实现函数的返回值是一种通用的方法既能返回整数又能返回字符串函数结束前使用echo命令将结果显示到标准输出调用函数时使用如下的格式将函数的输出结果存到变量RES中之后便可使用变量$RES的值(或输出、或执行测试、或进一步处理等)RES=$(functionName)echo$RES年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)对比RES=$(ls)echo$RES命令能出现的地方函数调用也能出现使用标准输出返回函数值年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash##filename:functiontouppersh#UserdefineFunction(UDF)toupper(){localstr="$"localoutputoutput=$(tr'az''AZ'<<<"${str}")echo$output}###Mainscriptstartshere###toupper"ThisIsaTEST"res=$(toupper"$")echo"$res"res=$(toupper"$")$res=="YES"echo"Continue"||echo"Stop"functiontouppershYESwearefunctiontouppershNowearenot系统INIT启动脚本的结构etcrcdinitd*年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#execsourcefunctionlibraryetcrcdinitdfunctionsstart(){}stop(){}restart(){stopstart}…………case"$"instart)startstop)stoprestart|reload)restart…………esac阅读etcinitd目录下的启动脚本熟悉Shell编程Shell脚本举例使用lftp命令从远程镜像YUM仓库到本地目录用法手动执行mirroryumreposshcentosepelrpmforgeremi例如:mirroryumreposshcentosepel安排cron任务etccrondmirroryumreposcron***rootrootbinmirroryumreposshcentos***rootrootbinmirroryumreposshepel***rootrootbinmirroryumreposshrpmforgeremi年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)#!binbash#ScriptName:rootbinmirroryumrepossh#usage(){echo"Usage:$centosepelrpmforgeremi"exit}#$#equsageLIST=""while$#gtdocase$incentos)LIST="$LISTCENTOS"shiftrpmforge)LIST="$LISTRPMFORGE"shiftepel)LIST="$LISTEPEL"shiftremi)LIST="$LISTREMI"shift*)usageesacdone#lockfile="varlocksubsysmirroryumreposwithlftp"f$lockfileexit||touch$lockfile#version=arch=iexcludes='"(x)|(SRPMS)|(ppc)|(isos)|(olds)"'#CENTOSURL="http:mirrorscomcentos$version"EPELURL="http:mirrorssohucomfedoraepel$version$arch"RPMFORGEURL="http:mirrorssohucomdagredhatel$versionen$archrpmforge"REMIURL="http:remimirrordedipowercomenterprise$version"#CENTOSMIRRORDIR="varftpyumdistrcentos$version"EPELMIRRORDIR="varftpyumreposepel$version$arch"RPMFORGEMIRRORDIR="varftpyumreposrpmforgeredhatel$versionen$archdag"REMIMIRRORDIR="varftpyumreposremienterprise$version"#!e$CENTOSMIRRORDIRmkdirp$CENTOSMIRRORDIR!e$EPELMIRRORDIRmkdirp$EPELMIRRORDIR!e$RPMFORGEMIRRORDIRmkdirp$RPMFORGEMIRRORDIR!e$REMIMIRRORDIRmkdirp$REMIMIRRORDIR#cdvarftpyumreposrpmforgeredhatel$versionen$arch!Lrpmforgelnsdagrpmforge#forxin$LISTdopath=${x}MIRRORDIRurl=${x}URLcd${!path}lftpe"setmirror:excluderegex$excludesmirrorPdeleteonlynewerverboseexit"${!url}$eqecho"Mirrored${x}repositoriesuccessfully">>tmpmirroreddonemails“YUMRepositorieMirrorLOG$(dateF)"root<tmpmirroredrmrf$lockfiletmpmirroredShell脚本举例显示系统信息sysinfoshsysinfoselectsh熟悉如下Shell语句和常用命令变量和数组的使用常用的信息显示命令管道和过滤器(grep、cut、sort、sed、awk)数值计算流程控制(if、case、for、select)年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)进一步学习http:bootinfoscriptsfnet#!binsh##filename:sysinfoselectshLANG=C#UserdefineFunction(UDF)echoline(){c=$(expr(${#}))if$#==thenfor((i=i<$ci))doechon"="doneechon"$"for((i=i<$ci))doechon"="doneelsefor((i=i<i))doechon"="donefiecho""}hello(){echo"Hello,$(whoami)<$(hostname)>!"echo"Nowtimeis$(date)"}ldavg(){echo"`uptime`"}general(){cpu=`catproccpuinfo|grep"modelname"|cutd":"f|uniq`cpucount=`catproccpuinfo|grep"physicalid"|sort|uniq|wcl`ProcessorCOUNT=`catproccpuinfo|grep"processor"|uniq|wcl`RAM=`catprocmeminfo|grepMemTotal|awkF:'{print$}'|awkF'{print$""$}'`SWAP=`catprocmeminfo|grepSwapTotal|awkF:'{print$}'|awkF'{print$""$}'`OS=`catetcredhatrelease`kernel=`unamesr`echo"CPU:$cpu"echo"CPUCount:$cpucount"echo"ProcessorCOUNT:$ProcessorCOUNT"echo"OS:$OS"echo"kernel:$kernel"echo"RAM:$RAM"echo"SWAP:$SWAP"}maxcproc(){$==''lines=pseo"C:p:z:a"|headpseo"C:p:z:a"|grepv"^CPU"|sortnr|head$lines}maxmproc(){$==''lines=pseo"C:p:z:a"|headpseo"C:p:z:a"|grepv"^CPU"|sortknr|head$lines}disk(){if"$(lsdprocidehd*>dev)"thenforDEVin`lsdprocidehd*|sed's*'`doMODEL=`catprocide$DEVmodel`ifeprocide$DEVcapacitythenSIZE=`catprocide$DEVcapacity`SIZE=`expr$SIZE`elseifesysblock$DEVsizethenSIZE=`catsysblock$DEVsize`SIZE=`expr$SIZE`elseSIZE='(unknown)'fifiecho"IDE:dev$DEV$MODEL$SIZEGB"donefiif"$(lsdsysblocksd*>dev)"thenforDEVin`lsdsysblocksd*|sed's*'`doMODEL=`catsysblock$DEVdevicemodel`SIZE=`catsysblock$DEVsize`SIZE=`expr$SIZE`echo"SCSISASSATA:dev$DEV$MODEL$SIZEGB"donefi}filesystem(){echo"`dfhxtmpfs|grepv^n`"}mpstat(){mpstat}vmstat(){vmstat}iostat(){iostatd}net(){forDEVin`sbinifconfiga|grep'^w'|awk'!lo{print$}'`doIP=`sbinifconfig$DEV|awkF:'inet{print$}'|awk'{print$}'`echoe"$DEVt:$IP"done}###Mainscriptstarshere###cleardeclareacmdinfoinfo=("Hello""UptimeandLoadaverage""Generalinfomation""Diskinfomation""Filesysteminfomation""MaxCPUusageProcesses,Currently""MaxMEMusageProcesses,Currently""Reportprocessorsrelatedstatistics""Reportvirtualmemorystatistics""Reportinputoutputstatistics""Networkinterfaceinfomation""Quit")cmd=(helloldavggeneraldiskfilesystemmaxcprocmaxmprocmpstatvmstatiostatnet)PS="Pleasechoose:"selectsin"${info}"do$s=="Quit"exitcase$REPLYin||||||||||)echolineecholine"${info$REPLY}"echoline${cmd$REPLY}echoline*)echo"Chooseerror,retry"esacdone本章思考题Shell脚本的成分?通常在何种情况下使用函数?试比较各种括号在条件测试中的异同?(())试比较各种括号的作用${}$()$$(())什么是位置参数?shift命令的功能?循环控制语句break和continue的功能?年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)本章实验学会使用变量替换扩展。学会使用Shell提供的各种流程控制语句。录入、运行并调试本章的例程。年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)进一步学习BashReferenceManualhttp:wwwgnuorgsoftwarebashmanualusrsharedocbash*bashrefhtmlBashscriptexamplesusrsharedocbash*scripts**usrsharedocbash*functions*usrsharedocbash*loadables*年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)进一步学习http:tldporgLDPBashBeginnersGuidehtmlhttp:tldporgLDPabshtmlhttp:wwwlinuxsirorgmaindocabsabscnhtmindexhtmlhttp:linuxconfigorgBashscriptingTutorialhttp:wwwlinuxdocorgHOWTOBashProgIntroHOWTOhtmlhttp:bashcybercitibizguidehttp:wikibashhackersorghttp:wwwthegeekstuffcomtagbashtutorialhttp:serverfaultcomquestionstaggedbashhttp:stackoverflowcomquestionstaggedbashhttp:wwwlinuxjournalcomtagbashhttp:wwwsoftpanoramaorgScriptingshellsshtml年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA)http:wwwthegeekstuffcommakevimasyourbashideusingbashsupportplugin与BASH相关的项目http:bashishsourceforgenethttp:bashdbsourceforgenethttp:wwwbackupmanagerorghttp:nanobloggersourceforgenethttp:sourceforgenetprojectsvimhelperhttp:sourceforgenetprojectsthylacine年月日梁如军(linuxbookscom)CreativeCommonsLicense(BYNCSA

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +1积分

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

资料评分:

/174
¥30.0 购买

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料

复康路复康里 梅怡新村 地坪 寿宝庄村 观音桥镇
王家村小儿专科 后德胜 兴华北街 景泰社区 浙江余杭区崇贤镇