定安| 温县| 舟曲| 巨鹿| 郸城| 红古| 青白江| 安陆| 繁昌| 邹平| 顺昌| 阎良| 眉山| 贺兰| 漳县| 确山| 徽州| 八达岭| 黄陂| 西青| 康乐| 聂荣| 宾县| 梁河| 天全| 正安| 保山| 勃利| 宜章| 福泉| 临潭| 额尔古纳| 舒兰| 山西| 平定| 汝城| 贵州| 尉犁| 水富| 贵德| 绥德| 苍梧| 兰考| 石楼| 界首| 新巴尔虎右旗| 壤塘| 资源| 鄂州| 平坝| 仁怀| 汤旺河| 建昌| 灵丘| 柯坪| 来安| 华池| 南岳| 犍为| 绛县| 定结| 昌平| 天池| 靖边| 安康| 庆云| 高要| 长白| 全州| 贵阳| 牟定| 调兵山| 永城| 怀安| 唐县| 新田| 五大连池| 吉安县| 商丘| 昌江| 藁城| 乐亭| 建阳| 涞水| 雷州| 马祖| 随州| 祁东| 宁蒗| 奇台| 杭州| 惠民| 城固| 翁源| 平乐| 陆河| 枝江| 双鸭山| 金华| 东平| 巨鹿| 乌苏| 莱芜| 通城| 芮城| 珠穆朗玛峰| 新巴尔虎右旗| 巫山| 北川| 改则| 民乐| 南澳| 汤原| 五莲| 新会| 炎陵| 托克托| 龙里| 利津| 大同市| 环江| 崇阳| 乡宁| 托里| 梁平| 成县| 石狮| 高明| 卫辉| 阜阳| 青海| 虎林| 兴和| 崇礼| 临海| 武进| 黄山市| 望都| 新蔡| 公安| 娄底| 歙县| 汪清| 鄢陵| 浙江| 安庆| 边坝| 北川| 阿合奇| 东明| 布拖| 兴义| 太白| 射洪| 辉县| 淮南| 枣庄| 普洱| 蛟河| 乌审旗| 宁乡| 花都| 夷陵| 金塔| 正宁| 荔浦| 安义| 荔浦| 银川| 古浪| 綦江| 乌马河| 禄劝| 丘北| 武川| 偃师| 东丰| 德州| 菏泽| 广河| 蛟河| 汉源| 镇宁| 益阳| 秀山| 普洱| 乐至| 德化| 中牟| 彭水| 贵南| 乌兰| 临县| 禹州| 蒲城| 延安| 科尔沁右翼前旗| 开封县| 阳西| 额尔古纳| 盐山| 阳曲| 海丰| 歙县| 王益| 自贡| 奉新| 克拉玛依| 威信| 新和| 秦皇岛| 嵊州| 沁水| 满城| 丹凤| 新宾| 米林| 贵阳| 夷陵| 融安| 滁州| 永城| 陇南| 织金| 温江| 连江| 双柏| 行唐| 戚墅堰| 广安| 秦安| 兴山| 抚松| 金阳| 山东| 乌鲁木齐| 九龙坡| 墨脱| 曲水| 彭水| 石龙| 石河子| 延川| 覃塘| 石棉| 马关| 茂港| 嘉禾| 个旧| 岳阳县| 宜川| 马鞍山| 屏东| 登封| 四会| 高唐| 望谟| 滴道| 喀什| 临沧| 垦利| 金阳| 冀州| 岗巴|

苹果彩票登陆:

2018-10-19 00:17 来源:中国西藏

  苹果彩票登陆:

  岳阳市天岳幕阜山旅游开发有限公司为此作了有益的工作。”肇东市农业局局长张彦杰说。

我们制衡台湾的能力和手段要比制衡美国便捷的多,不说政治外交,也不说IT业旅游业,仅将解放军的导弹调整一下方位,仅将联合军演的地点换一下场景,仅将军机军舰绕岛战巡的次数略做增加,台湾民众可以体验一下这种感观,从此,岛无宁日。法国从右向左,英国从左向右,德国则在左右之间摇摆而摇摇欲坠,美国更是热闹,共和党被茶党绑架,民主党被左翼社会运动挟持,左的更左,右的更右,最大公约数越来越难寻找,治理共识越来越难以达成,传统政治理念近乎被颠覆。

  ”  农业局副局长尹才提到:“肇东的这些金融改革措施,让资金的需求端和供给端间的融合更紧密了,也有效提高了现代化农业水平,形成了生产、加工、销售、服务、金融的闭环式发展模式,提高了农产品品质和农民收入,不仅解决了棘手的实际困难,也滋养了本土品牌,打造出很多响当当的地方名片。由于红枣的颜色和高含铁量,很多人认为它是补血佳品。

  继续走好强起来之路,需要深入理解和把握网络化世界,不断强化网络思维、提高网络能力。成都市郫都区推墙造绿建菜园,无疑是一项很有创意的做法,不仅解决了民居长期信访问题,还为城市增添了一道绿色风景。

新任期内,普京会延续当前的外交政策,总体对西方保持强硬,坚决捍卫俄国家利益,同时积极发展与非西方国家的关系,外交总体向东转的态势不会改变,反而会有所强化。

  冷战结束及苏联解体为俄换来的与西方关系改善损失殆尽,莫斯科几乎回到了自己在冷战时期的地缘政治原点。

  唯有如此,才能营造出风清气正、廉政务实的政治氛围。导致很多人并不看重,或者说不愿意请律师来扮演防火墙的角色。

  这时,国际货币基金组织和世行为这些危机国的债务进行了重组和展期,但也逼迫它们变卖掉一些国家资产,进行大规模的私有化。

  这样一来,我们的工作思路就非常的明确,目标就非常的清晰了。稳健党派的崩溃几乎发生于整个西欧地区,在比利时、荷兰、卢森堡三国和北欧诸国,曾经最热心地为欧洲价值观和统一理念摇旗呐喊,如今又高唱自由和民主主义的政治家,已几乎全部从欧洲舞台上消失。

  首先,理想信念是党在整体上凝聚力的一个基础。

  纵观华夏历史上有许多伟大的母亲,为中华民族的作出了巨大贡献。

  这是交易的重点。资本外逃造成东南亚国家的房地产泡沫破裂,随后爆发了金融危机。

  

  苹果彩票登陆:

 
责编:
关闭

关闭

关闭

封号提示

内容

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

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

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

烟雨梦兮 2018-10-19 评分 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 购买

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料

逄王新村 海洪 上格 永丰县工业园区 公溪镇
平福头乡 下牟家庄 滨河西里北区社区 华联 三道龙门