Shell脚本-从入门到精通.ppt

上传人:sh****n 文档编号:7555519 上传时间:2020-03-22 格式:PPT 页数:74 大小:358.50KB
返回 下载 相关 举报
Shell脚本-从入门到精通.ppt_第1页
第1页 / 共74页
Shell脚本-从入门到精通.ppt_第2页
第2页 / 共74页
Shell脚本-从入门到精通.ppt_第3页
第3页 / 共74页
点击查看更多>>
资源描述
Linux操作系统 Shell脚本编程 主要内容和学习要求 掌握创建shell脚本的基本步骤学会使用条件测试掌握if条件结构与case选择结构掌握for循环 while循环和until循环结构学会shift命令的使用学会shell脚本的调试 Shell脚本 Shell脚本 如果有一系列你经常使用的Linux命令 你可以把它们存储在一个文件里 shell可以读取这个文件并顺序执行其中的命令 这样的文件被称为脚本文件 shell脚本按行解释 Shell脚本的编写 Shell脚本是纯文本文件 可以使用任何文本编辑器编写Shell脚本通常是以 sh作为后缀名 Shell脚本的执行 chmod xscript name script name bashscript name 第一行 指定用哪个程序来编译和执行脚本 Shell脚本的格式 bin bash 可执行语句和shell控制结构 注释 以 开头 可独占一行 或跟在语句的后面 Shell脚本 bin sh bin csh 一个shell脚本通常由一组Linux命令 shell命令 控制结构和注释语句构成 在脚本中多写注释语句是一个很好的编程习惯 bin bash ThisisthefirstBashshellprogram ScriptName greetings shechoecho e Hello LOGNAME c echo it snicetalkingtoyou echo Yourpresentworkingdirectoryis pwd Showthenameofpresentdirectoryechoecho e Thetimeis date T nBye echo bashgreetings sh chmod xgreetings sh greetings Shell脚本举例 echo命令 功能说明 显示文字 语法 echo ne 字符串 或echo help version 补充说明 echo会将输入的字符串送往标准输出 输出的字符串间以空白字符隔开 并在最后加上换行号 n不进行换行 e若字符串中出现以下字符 则特别加以处理 而不会将它当成一般文字输出 n换行 b空格 参数 n不要在最后自动换行 e若字符串中出现以下字符 则特别加以处理 而不会将它当成一般文字输出 a发出警告声 b删除前一个字符 c最后不加上换行符号 f换行但光标仍旧停留在原来的位置 n换行且光标移至行首 r光标移至行首 但不换行 t插入tab v与 f相同 插入 字符 nnn插入nnn 八进制 所代表的ASCII字符 help显示帮助 version显示版本信息 bin bash Thisscriptistotesttheusageofread Scriptname ex4read shecho examplesfortestingread echo e Whatisyourname c readnameecho Hello name echoecho n Wheredoyouwork readecho Iguess REPLYkeepsyoubusy echoread p Enteryourjobtitle 自动读给REPLYecho Ithoughtyoumightbean REPLY echoecho Endofthescript Shell脚本举例 read命令 readvariable 读取变量给variablereadxy 可同时读取多个变量read 自动读给REPLYread p Pleaseinput 自动读给REPLY 状态变量 中保存命令退出状态的值 grep USER etc passwdecho grephello etc passwd echo 条件测试 条件测试可以根据某个特定条件是否满足 来选择执行相应的任务 Bash中允许测试两种类型的条件 命令成功或失败 表达式为真或假 任何一种测试中 都要有退出状态 返回值 退出状态为0表示命令成功或表达式为真 非0则表示命令失败或表达式为假 内置测试命令test 通常用test命令来测试表达式的值 x 5 y 10test x gt yecho test命令可以用方括号来代替 x 5 y 10 x gt y echo 表达式测试包括字符串测试 整数测试和文件测试 测试表达式的值 方括号前后要留空格 name Tom name Tt echo 2 x版本以上的Bash中可以用双方括号来测试表达式的值 此时可以使用通配符进行模式匹配 测试表达式的值 name Tt echo 字符串测试 name Tom z name echo 操作符两边必须留空格 字符串测试 name2 Andy name name2 echo 整数测试 即比较大小 x 1 x eq1 echo x a x eq1 echo 整数测试 操作符两边必须留空格 X 整数测试也可以使用let命令或双圆括号 x 1 let x 1 echo x 1 x 1 2 echo 只能用于整数测试 整数测试 相应的操作符为 例 两种测试方法的区别 使用的操作符不同let和双圆括号中可以使用算术表达式 而中括号不能let和双圆括号中 操作符两边可以不留空格 逻辑测试 x 1 name Tom x eq1 a n name echo 逻辑测试 注 不能随便添加括号 x eq1 a n name echo X x 1 name Tom x eq1echo 可以使用模式的逻辑测试 逻辑测试 文件测试 文件是否存在 文件属性 访问权限等 常见的文件测试操作符 更多文件测试符参见test的在线帮助 mantest 文件测试 检查空值 name name X name X 检查空值 语法结构 ifexpr1 如果expr1为真 返回值为0 then 那么commands1 执行语句块commands1elifexpr2 若expr1不真 而expr2为真then 那么commands2 执行语句块commands2 可以有多个elif语句else else最多只能有一个commands4 执行语句块commands4fi if语句必须以单词fi终止 if条件语句 commands为可执行语句块 如果为空 需使用shell提供的空命令 即冒号 该命令不做任何事情 只返回一个退出状态0 if语句可以嵌套使用 ex4if sh chkperm sh chkperm2 sh name grep tellme tellme2 idcheck sh 几点说明 elif可以有任意多个 0个或多个 else最多只能有一个 0个或1个 if语句必须以fi表示结束 expr通常为条件测试表达式 也可以是多个命令 以最后一个命令的退出状态为条件值 ex4if sh bin bash scriptname ex4if sh echo n Pleaseinputx y readxyecho x x y y if x y thenecho xislargerthany elif x y thenecho xisequaltoy elseecho xislessthany fi chkperm sh bin bash Usingtheoldstyletestcommand filename perm check sh file testingif d file thenecho fileisadirectory elif f file thenif r file a w file a x file then nestedifcommandecho Youhaveread write andexecutepermissionon file fielseecho fileisneitherafilenoradirectory fi chkperm2 sh bin bash Usingthenewstyletestcommand filename perm check2 sh file testingif d file thenecho fileisadirectory elif f file thenif r file w file x file then nestedifcommandecho Youhaveread write andexecutepermissionon file fielseecho fileisneitherafilenoradirectory fi name grep bin bash filename name grep name Tomifgrep name etc passwd dev nullthen elseecho namenotfoundin etc passwd exit2fi tellme bin bashecho n Howoldareyou readageif age lt0 o age gt120 thenecho Welcometoourplanet exit1fiif age ge0 a age le12 thenecho Childrenistheflowersofthecountry elif age gt12 a age le19 thenecho Rebelwithoutacause elif age gt19 a age le29 thenecho Yougottheworldbythetail elif age ge30 a age le39 thenecho Thirtysomething elseecho SorryIasked fi tellme2 bin bashecho n Howoldareyou readageif age120 thenecho Welcometoourplanet exit1fiif age 0 age 13 age 19 age 30 age 39 thenecho Thirtysomething elseecho SorryIasked fi idcheck sh bin bash Scriptname idcheck sh purpose checkuseridtoseeifuserisroot Onlyroothasauidof0 Formatforidoutput uid 501 tt gid 501 tt groups 501 tt root suid 0 uid 0 root gid 0 root groups 0 root id id awk F print 2 getuseridecho youruseridis id if id 0 id eq0 thenecho youaresuperuser elseecho youarenotsuperuser fi 语法结构 caseexprin expr为表达式 关键词in不要忘 pattern1 若expr与pattern1匹配 注意括号commands1 执行语句块commands1 跳出case结构pattern2 若expr与pattern2匹配commands2 执行语句块commands2 跳出case结构 可以有任意多个模式匹配 若expr与上面的模式都不匹配commands 执行语句块commands 跳出case结构esac case语句必须以esac终止 case选择语句 case语句举例 yes no sh 几点说明 每个命令块的最后必须有一个双分号 可以独占一行 或放在最后一个命令的后面 所给的匹配模式pattern中可以含有通配符和 如果expr没有找到匹配的模式 则执行缺省值 后面的命令块 类似于if中的else 可以不出现 表达式expr按顺序匹配每个模式 一旦有一个模式匹配成功 则执行该模式后面的所有命令 然后退出case yes no sh bin bash testcase scriptname yes no sh echo n Doyouwishtoproceed y n readanscase ansiny Y yes Yes echo yesisselected n N no No echo noisselected echo basename 0 Unknownresponse exit1 esac 语法结构 forvariableinlist 每一次循环 依次把列表list中的一个值赋给循环变量do 循环开始的标志commands 循环变量每取一次值 循环体就执行一遍done 循环结束的标志 几点说明 列表list可以是命令替换 变量名替换 字符串和文件名列表 可包含通配符 for循环执行的次数取决于列表list中单词的个数for循环体中一般要出现循环变量 但也可以不出现 for循环语句 执行第一轮循环时 将list中的第一个词赋给循环变量 并把该词从list中删除 然后进入循环体 执行do和done之间的命令 下一次进入循环体时 则将第二个词赋给循环变量 并把该词从list中删除 再往后的循环也以此类推 当list中的词全部被移走后 循环就结束了 循环执行过程 forloop sh mybackup sh 位置参量的使用 与 greet sh 可以省略inlist 此时使用位置参量 permx shidcheck shgreet shyes no shpermx sh sh for循环执行过程 forloop sh bin bash Scriptname forloop shfornameinTomDickHarryJoedoecho Hi name doneecho outofloop forloop2 sh bin bash Scriptname forloop2 shfornamein catnamelist doecho Hi name doneecho outofloop mybackup sh bin bash Scriptname mybackup sh Purpose Createbackupfilesandstore theminabackupdirectory backup dir backupmkdir backup dirforfilein shdoif f file thencp file backup dir file bakecho fileisbackedupin backup dir fidone greet sh bin bash Scriptname greet sh usage greet shTomJohnAnndyecho using fornamein sameasfornamein doechoHi namedoneecho using fornamein sameasfornamein doechoHi namedoneecho using fornamein doechoHi namedoneecho using fornamein doechoHi namedone permx sh bin bash Scriptname permx sh forfile Emptywordlistdoif f file x file thenchmod x fileecho filenowhasexecutepermission fidone 语法结构 whileexpr 执行exprdo 若expr的退出状态为0 进入循环 否则退出whilecommands 循环体done 循环结束标志 返回循环顶部 执行过程 先执行expr 如果其退出状态为0 就执行循环体 执行到关键字done后 回到循环的顶部 while命令再次检查expr的退出状态 以此类推 循环将一直继续下去 直到expr的退出状态非0为止 while循环语句 语法结构 untilexpr 执行exprdo 若expr的退出状态非0 进入循环 否则退出untilcommands 循环体done 循环结束标志 返回循环顶部 执行过程 与while循环类似 只是当expr退出状态非0时才执行循环体 直到expr为0时退出循环 until循环语句 用于强行退出当前循环 如果是嵌套循环 则break命令后面可以跟一数字n 表示退出第n重循环 最里面的为第一重循环 用于忽略本次循环的剩余部分 回到循环的顶部 继续下一次循环 如果是嵌套循环 continue命令后面也可跟一数字n 表示回到第n重循环的顶部 break n continue n 例 months sh break和continue months sh bin bash Scriptname months shformonthinJanFebMarAprMayJunJulAugSepOctNovDecdoforweekin1234doecho n Processingthemonthof month OK readansif ans n o z ans thencontinue2else echo n Processweek weekof month readansif ans n o z ans thencontinueelseecho Nowprocessingweek weekof month sleep1 Commandsgohereecho Doneprocessing fifidonedone sleepn exit和sleep exitn exit命令用于退出脚本或当前进程 n是一个从0到255的整数 0表示成功退出 非零表示遇到某种失败而非正常退出 该整数被保存在状态变量 中 exit命令 sleep命令 暂停n秒钟 语法结构 说明 select循环主要用于创建菜单 按数字顺序排列的菜单项将显示在标准错误上 并显示PS3提示符 等待用户输入用户输入菜单列表中的某个数字 执行相应的命令用户输入被保存在内置变量REPLY中 selectvariableinlistdo 循环开始的标志commands 循环变量每取一次值 循环体就执行一遍done 循环结束的标志 例 runit sh select循环与菜单 runit sh bin bash Scriptname runit shPS3 Selectaprogramtoexecute selectprogramin ls F pwddatedo programdone 例 goodboy sh select经常和case联合使用 select是个无限循环 因此要记住用break命令退出循环 或用exit命令终止脚本 也可以按ctrl c退出循环 与for循环类似 可以省略inlist 此时使用位置参量 select与case goodboy sh bin bash Scriptname goodboys shPS3 Pleasechooseoneofthethreeboys selectchoiceintomdanguy selectchoicedocase choiceintom echoTomisacooldude break breakoutoftheselectloopdan guy echoDanandGuyarebothwonderful break echo REPLYisnotoneofyourchoices echo Tryagain esacdone shift n 用于将参量列表list左移指定次数 缺省为左移一次 参量列表list一旦被移动 最左端的那个参数就从列表中删除 while循环遍历位置参量列表时 常用到shift doit shabcdefgh shft shabcdefgh 循环控制shift命令 例 doit sh bin bash Name doit sh Purpose shiftthroughcommandlinearguments Usage doit sh args while 0 or gt0 doecho shiftdone shft sh bin bash Using shift tostepthroughallthepositionalparameters until z 1 Untilallparametersusedup doecho 1 shiftdoneecho Extralinefeed exit0 生成随机数的特殊变量 echo RANDOM范围是 0 32767 expr 通用的表达式计算命令 表达式中参数与操作符必须以空格分开 表达式中的运算可以是算术运算 比较运算 字符串运算和逻辑运算 expr5 3 expr5 3 乘法符号必须被转义 随机数和expr命令 字符串操作 注 pattern old中可以使用通配符 例 ex4str m的取值从0到 var 1 字符串操作 ex4str bin bashdirname usr bin local bin echo dirname dirname echo n dirname sleep4 echo dirname echoecho n dirname 4 sleep4 echo dirname 4 echoecho n dirname 8 6 sleep4 echo dirname 8 6 echoecho n dirname bin sleep4 echo dirname bin echoecho n dirname bin sleep4 echo dirname bin echoecho n dirname bin sleep4 echo dirname bin echoecho n dirname bin sleep4 echo dirname bin echoecho n dirname bin sleep4 echo dirname bin echoecho n dirname bin echo dirname bin echoecho n dirname bin sbin echo dirname bin sbin echoecho n dirname bin lib echo dirname bin lib echoecho n dirname bin lib echo dirname bin lib sh x脚本名 该选项可以使用户跟踪脚本的执行 此时shell对脚本中每条命令的处理过程为 先执行替换 然后显示 再执行它 shell显示脚本中的行时 会在行首添加一个加号 sh v脚本名 在执行脚本之前 按输入的原样打印脚本中的各行 打印一行执行一行 sh n脚本名 对脚本进行语法检查 但不执行脚本 如果存在语法错误 shell会报错 如果没有错误 则不显示任何内容 脚本调试 编程小结 变量 局部变量 环境变量 export declare x 只读变量 整型变量 例 declare ix x hello echo x 0 位置参量 0 1 变量的间接引用 eval str 例 name hello x name echo x hello 命令替换 cmd cmd 整数运算declare定义的整型变量可以直接进行运算 否则需用let命令或 进行整数运算 编程小结 输入输出 输入 read readvar1var2 read read p 提示 输出 printf printf 12 5f t d n 123 458 format以 开头 flag fieldwidth precision 格式符 左对齐 输出符号0 空白处添0空格 前面加一空格 字段宽度 小数点后输出位数 cdefgsox b n r t v REPLY REPLY 输出参数用空格隔开 字符串测试 编程小结 条件测试 操作符两边必须留空格 如果使用双方括号 可以使用通配符进行模式匹配 例 name Tom name Tom echo 编程小结 条件测试 整数测试 注意这两种方法的区别 编程小结 条件测试 逻辑测试 如果使用双方括号 可以使用通配符进行模式匹配 编程小结 条件测试 文件测试 编程小结 控制结构 if条件语句case选择语句for循环语句while循环语句until循环语句break continue sleep命令select循环与菜单shift命令 各种括号的作用 function name commands 函数 一个函数就是一个子程序 用于完成特定的任务 当有重复代码 或者一个任务只需要很少的修改就被重复几次执行时 这时你应考虑使用函数 functionfunction name commands 函数的一般格式 和其它编程语言一样 Bash也可以定义函数 函数举例 bin bashfun1 echo Thisisafunction echo Nowexitingfun1 fun2 echo Thisisfun2 echo Nowexitingfun2 只需输入函数名即可调用该函数 函数的调用 函数必须在调用之前定义 bin bashfun2 echo Thisisfun2 echo Nowexitingfun2 fun2 调用函数fun2 例 ex4fun2 sh ex4fun3 sh ex4fun2 sh bin bashJUST A SECOND 1fun Asomewhatmorecomplexfunctioni 0REPEATS 5echoecho Andnowthefunreallybegins echosleep JUST A SECOND Hey waitasecond while i lt REPEATS doecho FUNCTIONS echo echolet i 1 done Now callthefunctions funexit0 ex4fun3 sh f1 Willgiveanerrormessage sincefunction f1 notyetdefined declare ff1 Thisdoesn thelpeither f1 Stillanerrormessage However f1 echo Callingfunction f2 fromwithinfunction f1 f2 f2 echo Function f2 f1 Function f2 isnotactuallycalleduntilthispoint althoughitisreferencedbeforeitsdefinition Thisispermissible 向函数传递参数 函数的调用 例 ex4fun4 sh 函数与命令行参数 例 ex4fun5 sh return与exit 例 ex4fun6 sh 向函数传递参数例 ex4fun4 sh bin bash FunctionsandparametersDEFAULT default Defaultparamvalue func2 if z 1 Isparameter 1zerolength thenecho Parameter 1iszerolength elseecho Param 1is 1 fivariable 1 DEFAULT echo variable variable if n 2 thenecho Parameter 2is 2 fireturn0 echoecho Nothingpassed func2 Calledwithnoparamsechoecho Oneparameterpassed func2first Calledwithoneparamechoecho Twoparameterspassed func2firstsecond Calledwithtwoparamsechoecho second passed func2 second Thefirstparameterisofzero lengthechoexit0 Endofscript 函数与命令行参数例 ex4fun5 sh bin bash functionandcommandlinearguments Callthisscriptwithacommandlineargument somethinglike 0arg1 func echo 1 echo Firstcalltofunction noargpassed echo Seeifcommand lineargisseen Func No Command lineargnotseen echo echoecho Secondcalltofunction command lineargpassedexplicitly func 1 Nowit sseen exit0 return与exit例 ex4fun6 sh bin bash purpose Maximumoftwointegers max2 Returnslargeroftwonumbers if z 2 thenecho Needtopasstwoparameterstothefunction exit1fiif 1 2 1 eq 2 thenecho Thetwonumbersareequal exit0elseif 1 gt 2 thenreturn 1elsereturn 2fifi readnum1num2echo num1 num1 num2 num2 max2 num1 num2return val echo Thelargerofthetwonumbersis return val exit0
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!