




已阅读5页,还剩169页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章bash脚本编程 本章内容要点 Shell脚本的编制 执行和调试Shell脚本的成分和编码规范Shell变量替换扩展 数值计算 输入输出变量分类 位置参数变量和特殊参数变量条件测试 文件测试 字符串测试 整数测试 分支流程控制 if case 循环流程控制 for while until select 函数的定义和调用 返回值使用循环分析命令行参数 本章学习目标 熟悉Shell脚本的编码规范 掌握执行和调试方法掌握对变量进行整数运算和间接引用的方法理解位置参数变量和特殊参数变量的用途掌握条件测试的使用 掌握各种流程控制语句的使用if casefor while until select break continue掌握函数的定义 调用和传递返回值的方法掌握命令行参数 位置参数的操作 shift getopts Shell编程基础 2020年1月1日 4 Shell脚本和Shell编程 当命令不在命令行中执行 而是从一个文件中执行时 该文件就称为Shell脚本 Shell脚本是纯文本文件 Shell脚本通常以 sh作为后缀名 但不是必须 Shell脚本是以行为单位的 在执行脚本的时候会分解成一行一行依次执行 Shell是一种功能强大的解释型编程语言通常用于完成特定的 较复杂的系统管理任务Shell脚本语言非常擅长处理文本类型的数据 2020年1月1日 5 Shell脚本的成分 程序元素保留字 运算符 表达式变量 数组 输入输出控制结构 顺序 分支 循环 子程序调用 Shell功能 参见第2 3章内容 执行命令 内置命令 外部命令 自编程序 重定向 管道 命令替换 命令聚合通配符 注释符 Shell环境 2020年1月1日 6 Shell脚本的建立与执行 Shell脚本的建立使用文本编辑器编辑脚本文件 viscript file为脚本文件添加可执行权限 chmod xscript fileShell脚本的执行在子Shell中执行 bashscript file script file在当前Shell中执行 sourcescript file script file 2020年1月1日 7 PATH环境变量的默认值不包含当前目录 若脚本文件在当前目录 应使用 script file PATH环境变量的默认值包含 bin目录 用户可以将自己的脚本文件存放在 bin目录 之后即可直接调用脚本文件名执行脚本了 Shell脚本的编码规范 以 开头 通知系统用何解释器执行此脚本 bin bash bin ksh以注释形式说明如下的内容 脚本名称 脚本功能 作者及联系方式 版本更新记录 版权声明 对算法做简要说明 如果是复杂脚本 2020年1月1日 8 Shell脚本举例 1 2020年1月1日 9 bin bash ThisisthefirstBashshellprogram Scriptname greetings shechoecho e Hello LOGNAME c echo it snicetalkingtoyou echo n Yourpresentworkingdirectoryis pwd Showthenameofpresentdirectoryechoecho e Thetimeis date T nBye echo Shell脚本举例 2 2020年1月1日 10 bin bash ScriptName etc cron daily ntpdate 使用NTP的客户端命令ntpdate与远程NTP服务器进行同步 也可以用局域网内的NTP服务器替换pool ntp org usr sbin ntpdate spool ntp org 更改硬件时钟时都会记录在 etc adjtime文件中 使hwclock根据先前的记录来估算硬件时钟的偏差 并用来校正目前的硬件时钟 sbin hwclock adjust 将系统时钟同步到硬件时钟 sbin hwclock systohc 脚本调试方法 在bash调用脚本时使用参数 bash x n v scriptName在脚本中使用bash内置的set命令使整个或部分脚本处于调试模式开启 set x n v 结束 set x n v 2020年1月1日 11 脚本调试1 2020年1月1日 12 sh x脚本名 该选项可以使用户跟踪脚本的执行 此时shell对脚本中每条命令的处理过程为 先执行替换 然后显示 再执行它 shell显示脚本中的行时 会在行首添加一个加号 sh v脚本名 在执行脚本之前 按输入的原样打印脚本中的各行 sh n脚本名 对脚本进行语法检查 但不执行脚本 如果存在语法错误 shell会报错 如果没有错误 则不显示任何内容 脚本调试举例1 对脚本进行语法检查 bash ngreetings sh显示脚本中每个原始命令行及其执行结果 bash vgreetings sh以调试模式执行脚本 bash xgreetings sh 2020年1月1日 13 脚本调试2 set命令 在脚本内使用set命令开启调试选项set x 显示由shell执行的命令及其参数set v 显示由shell读入的命令行set n 读取命令但不执行他们 用于语法检查在脚本内使用set命令关闭已开启的调试选项set xset vset n 2020年1月1日 14 脚本调试举例2 bashgreetings sh greetings sh sourcegreetings sh 2020年1月1日 15 bin bash ThisisthefirstBashshellprogram Scriptname greetings shset x TurnONdebugmode echoecho e Hello LOGNAME c echo it snicetalkingtoyou echo n Yourpresentworkingdirectoryis pwd Showthenameofpresentdirectoryechoset x TurnOFFdebugmode echo e Thetimeis date T nBye echo Shell脚本的类型 非交互式脚本不需要读取用户的输入 也不用向用户反馈某些信息每次执行都是可预见的 因为它不读取用户输入 参数是固定的可以在后台执行交互式脚本脚本可以读取用户的输入 实时向用户反馈信息 输出某些信息 这样的脚本更灵活 每次执行时的参数可由用户动态设定用户界面更友好 但不适用于自动化任务 如cron任务 2020年1月1日 16 学习Shell编程的前提 掌握一种文本编辑器的使用 Vi 熟悉Linux文件系统的布局学习Shell的各种功能重定向 管道 命令替换 命令聚合学习各种管理和监视命令的使用用户管理 权限管理 进程管理 包管理 系统监视 网络监视 学习各种文本文件工具的使用cat grep tr sed awk 正则表达式 2020年1月1日 17 系统的配置文件几乎都是纯文本文件 变量和表达式 2020年1月1日 18 Shell变量操作 变量替换扩展变量测试变量的字符串操作变量的间接引用变量的数值计算 expression expression exprletdeclare i 2020年1月1日 19 输入变量赋值name valuereadonly从标准输入读取read输出echoprintf 变量替换扩展 变量测试 2020年1月1日 20 变量测试举例 2020年1月1日 21 color bluenewcolor color grey unsetcolorecho Theskyis color grey today echo color echo Theskyis color grey today echo color echo Theskyis color error today echo color echo Theskyis color blue today echo color 变量替换扩展 字符串计数 截取 2020年1月1日 22 m的取值从0到 var 1 注 pattern中可以使用通配符 字符串变量替换扩展举例1 2020年1月1日 23 str Ilovelinux IloveUNIXtoo echo str 30echo str 13 IloveUNIXtoo echo str 7 5 linux echo str Ilove linux IloveUNIXtoo echo str I IloveUNIXtoo echo str I 变量替换扩展 字符串替换 2020年1月1日 24 注 1 old中可以使用通配符 2 var可以是 或 表示对每个位置参数进行替换 字符串变量替换扩展举例2 2020年1月1日 25 str Ilovelinux IloveUNIXtoo echo str love like Ilikelinux IloveUNIXtoo echo str love like Ilikelinux IlikeUNIXtoo echo str I linux IlikeFreeBSD IlikeFreeBSD IloveUNIXtoo echo str Ilove J aime J aimelinux IloveUNIXtoo echo str Ilove J aime J aimelinux J aimeUNIXtoo echo str too also Ilovelinux IloveUNIXalso 字符串变量替换扩展举例3 2020年1月1日 26 set1v11v21v31v4 echo 1v11v21v31v4echo 1 a av1av2av3av4echo 1 a avaav2av3av4echo 1 a 1va1v21v31v4 变量的间接引用 通过str2的值来引用str1的值 2020年1月1日 27 str1 HelloWorld str2 str1echo str2 bash2 0以上才支持newstr str2 echo newstrHelloWorld或echo str2 HelloWorld evalnewstr str2echo newstrHelloWorld或evalecho str2HelloWorld 变量的间接引用 续 2020年1月1日 28 通过x的值来引用CENTOS URL的值 x CENTOS CENTOS URL bash2 0以上才支持newstr x URLecho newstrCENTOS URLecho newstr evalnewstr x URLecho newstr或evalecho x URL Shell内置命令 eval 2020年1月1日 29 listpage ls l more eval listpage eval ssh agent evalnewstr str2evalecho x URL evalarg1 arg2 argN 对参数进行两次扫描和替换将所有的参数连接成一个表达式 并计算或执行该表达式参数中的任何变量都将被展开 Shell变量的分类 用户自定义变量由用户自己定义 修改和使用Shell环境变量由系统维护 用于设置用户的Shell工作环境只有少数的变量用户可以修改其值位置参数变量 PositionalParameters 通过命令行给程序传递执行参数可用shift命令实现位置参数的迁移专用参数变量 SpecialParameters Bash预定义的特殊变量用户不能修改其值 2020年1月1日 30 位置参数变量 是一组特殊的内置变量跟在脚本名后面的用空格隔开的每个字符串 1表示第1个参数值 9表示第9个参数值 10 表示第10个参数值 11 表示第11个参数值 位置参数的用途从shell命令 脚本的命令行接受参数在调用shell函数时为其传递参数 2020年1月1日 31 专用参数变量 命令行参数相关 将所有位置参量看成一个字符串 以空格间隔 将每个位置参量看成单独的字符串 以空格间隔 将所有位置参量看成一个字符串 以 IFS间隔 将每个位置参量看成单独的字符串 以空格间隔 0命令行上输入的Shell程序名 表示命令行上参数的个数 进程状态相关 表示上一条命令执行后的返回值 当前进程的进程号 显示运行在后台的最后一个作业的PID 在此之前执行的命令或脚本的最后一个参数 2020年1月1日 32 位置参数和专用参数举例 执行脚本 vartest sh1 23 45abcdefg 2020年1月1日 33 bin bash ScriptName vartest sh TotestPositionalParameters SpecialParameters echo Hello USER theoutputofthisscriptareasfollows echo Thescriptnameis basename 0 echo Thefirstparamofthescriptis 1 echo Thesecondparamofthescriptis 2 echo Thetenthparamofthescriptis 10 echo Alltheparamsyouinputare echo Alltheparamsyouinputare echo Thenumberoftheparamsyouinputare echo TheprocessIDforthisscriptis echo Theexitstatusofthisscriptis 和环境变量IFS 2020年1月1日 34 执行脚本 ifsargs sh1 23 45abcdefg bin bash ScriptName ifsargs sh SettheIFSto IFS echo Command LineArgumentsDemo echo Allargsdisplayedusing positionalparameter echo echo Allargsdisplayedusing positionalparameter echo echo Allargsdisplayedusing positionalparameter echo doublequoteadded echo Allargsdisplayedusing positionalparameter echo doublequoteadded 位置参数和shift命令 将位置参量列表依次左移n次 缺省为左移一次一旦位置参量列表被移动 最左端的那个参数就会从列表中删除经常与循环结构语句一起使用 以便遍历每一个位置参数 2020年1月1日 35 shift n bin sh ScriptName pp shift sh TotestPositionalParameters Shift echo Thescriptnameis 0 echo 1 1 2 2 3 3 4 4 echo shift 向左移动所有的位置参数1次echo 1 1 2 2 3 3 4 4 echo shift2 向左移动所有的位置参数2次echo 1 1 2 2 3 3 4 4 echo pp shift sh1b3d4f 退出 返回状态 返回上一条语句或脚本执行的状态0 成功1 255 不成功exit命令exit命令用于退出脚本或当前Shelln是一个从0到255的整数0表示成功退出 非零表示遇到某种失败返回值被保存在状态变量 中 2020年1月1日 36 exitn 常见的返回状态码 0 执行正确1 通用错误126 命令或脚本没有执行权限127 命令没找到 2020年1月1日 37 echo 显示当前进程的PID9245 echo 显示在此之前执行的命令的返回值0 bash 调用子Shell echo 显示当前进程的PID9474 exit1 指定返回值并返回父Shell echo 显示上一个Shell 脚本的返回值1 list 执行不存在的命令bash list commandnotfound echo 127 touchbbb sh bbb sh 执行不具有执行权限的命令bash bbb sh Permissiondenied echo 126 read 从键盘输入内容为变量赋值read p 信息 var1var2 若省略变量名 则将输入的内容存入REPLY变量结合不同的引号为变量赋值双引号 允许通过 符号引用其他变量值单引号 禁止引用其他变量值 视为普通字符反撇号 将命令执行的结果输出给变量更多read的用法参见http bash cyberciti biz guide Getting User Input Via Keyboard 2020年1月1日 38 read举例 2020年1月1日 39 bin bash Thisscriptistotesttheusageofread Scriptname ex4read shecho examplesfortestingread echo e Whatisyourname c readnameecho Hello name echoecho n Wheredoyouwork readecho Iguess REPLYkeepsyoubusy echoread p Enteryourjobtitle echo Ithoughtyoumightbean REPLY echoecho Endofthescript 只读变量 举例 2020年1月1日 40 只读变量 readonlyvariable 是指不能被清除或重新赋值的变量 lrj centos1 myname Osmond lrj centos1 echo mynameOsmond lrj centos1 readonlymyname lrj centos1 unsetmyname bash unset myname cannotunset readonlyvariable lrj centos1 myname OsmondLiang bash myname readonlyvariable lrj centos1 同时输出多行信息 使用echo使用herefile 2020年1月1日 41 echo Line1Line2Line3 cat END Line1Line2Line3 END 多行内容中不能出现双引号 否则echo提前结束若确实需要使用双引号 需使用转义字符 END 可以是任意字符串 只要上下一致即可多行内容中不能出现内容为 END 开始的行 否则cat提前结束 整数运算 Bash变量没有严格的类型定义本质上Bash变量都是字符串若一个字面常量或变量的值是纯数字的 不包含字母或其他字符 Bash可以将其视为长整型值 并可做算数运算和比较运算 Bash也允许显式地声明整型变量declare i变量名 2020年1月1日 42 算数运算符 2020年1月1日 43 注 按位运算是以二进制形式进行的 算术运算扩展 2020年1月1日 44 expression expression num1 4 1 echo num1num1 num1 2 3 echo num1 注意 的不同作用 用 进行整数运算时 括号内变量前的美元符号 可以省略 num2 2 3 2 1001 5 echo num2num2 2 3 2 1001 5 echo num2echo 2 3 2 1001 5 Shell内置命令 let let内置命令用于算术运算 2020年1月1日 45 num2 1 echo num2letnum2 4 1 echo num2letnum2 num2 1 echo num2 赋值符号和运算符两边不能留空格 如果将字符串赋值给一个整型变量时 则变量的值为0如果变量的值是字符串 则进行算术运算时设为0 letnum2 4 1let num2 4 1 用引号忽略空格的特殊含义 用let命令进行算术运算时 最好加双引号 expr 通用的表达式计算命令表达式中参数与操作符必须以空格分开 表达式中的运算可以是算术运算 比较运算 字符串运算和逻辑运算 2020年1月1日 46 manexpr expr5 3 expr5 3 乘法符号必须被转义 expr2 5 2 3 2 expr 2 5 2 3 括号必须被转义 浮点数运算 bash只支持整数运算可以通过使用bc或awk工具来处理浮点数运算 2020年1月1日 47 n echo scale 3 13 2 bc echo n m awk BEGIN x 2 45 y 3 123 printf 3f n x y echo m printf命令 2020年1月1日 48 printf可用来按指定的格式输出变量 printfformat输出参数列表 printf 12 5f n 123 456 format以 开头 flag fieldwidth precision 格式符 左对齐 输出符号0 空白处添0空格 前面加一空格 字段宽度 小数点后输出位数 printf命令 续 2020年1月1日 49 printf命令的格式说明符 format中还可以使用 printf命令举例 2020年1月1日 50 printf Thenumberis 2f n 100 printf 20s 12 5f n Joy 10 printf 10d 010o 10 x n 202020 printf 6d t 6o 6x n 202020 例 数组变量 2020年1月1日 51 Bash2 x以上支持一维数组 下标从0开始 variable item1item2item2 variable n value declare avariablevariable item1item2item2 使用declare声明或直接给变量名加下标来赋值 数组变量举例 2020年1月1日 52 declare astustu math1101math1102math1103 echo stu 0 列出stu的第一个元素echo stu 列出stu的所有元素echo stu 给出数组stu中元素的个数 Shell内置命令 declare 2020年1月1日 53 declare举例 2020年1月1日 54 declare rmyname osmondunsetmynamedeclaremyname OsmondLiang declare 变量及相关命令小结1 2020年1月1日 55 echo variable或echo variable unsetvariable set readonlyvariable exportvariable valueexport nvariableexport p declare 选项 variable value 变量及相关命令小结2 2020年1月1日 56 basenamedirname let或expr var word var word var word var word 0 1 9 n evalnewstr str2 newstr str2 hostname hostname basename pwd basename pwd expression expression 变量及相关命令小结3 2020年1月1日 57 输入 readvar1var2 read read p 提示 输出 printf 12 5f t d n 123 458 format以 开头 flag fieldwidth precision 格式符 左对齐 输出符号0 空白处添0空格 前面加一空格 字段宽度 小数点后输出位数 cdefgsox b n r t v REPLY REPLY 输出参数用空格隔开 条件测试 2020年1月1日 58 条件测试简介 条件测试可以判断某个特定条件是否满足测试之后通常会根据不同的测试值选择执行不同任务条件测试的种类命令成功或失败表达式为真或假条件测试的值Bash中没有布尔类型变量退出状态为0表示命令成功或表达式为真非0则表示命令失败或表达式为假状态变量 中保存了退出状态的值 2020年1月1日 59 条件测试举例 1 2020年1月1日 60 User osmond grep User etc passwd echo grep User etc passwd dev null echo Userisauserin etc passwd echo Userisn tauserin etc passwd Host centos1 ping c1 Host echo ping c1 Host dev null echo Hostisup echo Hostisdown 条件测试语句 语句格式1 test格式2 格式3 bash2 x版本以上 说明格式1和格式2是等价的 格式3是扩展的test命令在 中可以使用通配符进行模式匹配 能够正常存在于 中 但不能在 中出现 和 之后的字符必须为空格 和 之前的字符必须为空格要对整数进行关系运算也可以使用 进行测试 2020年1月1日 61 条件测试操作符 条件测试表达式中可用的操作符文件测试操作符字符串测试操作符整数二元比较操作符使用逻辑运算符 2020年1月1日 62 文件测试 2020年1月1日 63 测试 文件是否存在 文件属性 访问权限等 更多文件测试符参见test的在线帮助 mantest 使用lftp同步yum仓库 2020年1月1日 64 bin bash ScriptName sync iredmail yum repo shDIST 5ARCH i386 EXCL ARCH x86 64 SRC http iredmail org yum rpms DIST DST var ftp yum repos iredmail DIST ARCH e DST mkdir p DSTexcludes EXCL ARCH repodata cd DSTlftp e setmirror exclude regex excludes mirror delete only newer verbose exit SRCcreaterepo dev null 使用reposync同步仓库 2020年1月1日 65 bin bash ScriptName sync atomic repo with reposync shARCH i386 url 使用reposync同步仓库之前首先要配置仓库安装atomic release的RPM包导入其RPM公钥对yum和reposync使用不同的配置文件yum使用本地仓库配置以加快更新速度 etc yum conf和 etc yum repos d atomic reporeposync使用运程仓库配置 etc reposync conf和 etc yum repos d atomic repo 使用reposync同步仓库续1 2020年1月1日 66 f etc reposync conf cat etc yum repos d atomic repo atomic name CentOS RedHatEnterpriseLinux releasever baseurl file var ftp yum repos atomic centos 5 ARCH atomicenabled 1priority 1protect 0gpgkey file etc pki rpm gpg RPM GPG KEY art txtgpgcheck 1 END 配置对yum和reposync使用不同的配置文件仅当 etc reposync conf不存在时执行一次 使用reposync同步仓库续2 2020年1月1日 67 DST var ftp yum repos atomic centos 5 ARCH e DST mkdir p DST cd DST usr bin yumcleanall usr bin reposync arch ARCH repoid atomic d c etc reposync confcdatomic usr bin createrepo usr bin yumcleanall 若本地同步的目标目录不存在创建之 否则进入之使用reposync同步仓库的RPM文件 a arch 指定架构 i386 x86 64 r repoid 指定要同步的仓库名 d delete 删除本地存在而远程已经不存在的文件 c config 指定reposync使用的配置文件使用createrepo创建仓库 repodata 字符串测试 2020年1月1日 68 字符串按从左到右对应字符的ASCII码进行比较 字符串的空值检查 2020年1月1日 69 z name name X name X n name name X name X 检查空值 检查非空值 name name 整数测试 1 2020年1月1日 70 操作符两边必须留空格 整数测试 2 2020年1月1日 71 操作符两边的空格可省略 条件测试举例 2 2020年1月1日 72 a b echo 0 a b echo 0 n gt m echo 1 n m echo 1 n m echo 1 n m echo 1 n m echo 0 a linux b unix n 5 m 7 a b echoT echoFT a b echoT echoFT n gt m echoT echoFT n m echoT echoFF n m echoT echoFF n m echoT echoFF n m echoT echoFT 条件测试举例 3 2020年1月1日 73 name Tom z name echo name2 Andy name name2 echo name Tom name Tt echo name Tom name Tt echo 方括号前后要留空格 x 1 x eq1 echo x a x eq1 echo X X 内不能使用通配符 逻辑测试 2020年1月1日 74 条件测试举例 4 2020年1月1日 75 x 1echo x 1 name Tom x eq1 a n name echo 注 不能随便添加括号 x eq1 a n name echo X x 1echo 注 不能在 中做字符串比较 x 1 echo 此处的 并非逻辑运算符 而是命令聚合 CommandGroup X 流程控制 分支 2020年1月1日 76 流程控制语句 分支if条件语句case选择语句循环for循环语句while循环语句until循环语句select循环与菜单 2020年1月1日 77 循环控制break语句continue语句位置参数处理shift命令getopts命令 分支结构 if语句语法 2020年1月1日 78 ifexpr1 如果expr1为真 返回值为0 then 那么commands1 执行语句块commands1elifexpr2 若expr1不真 而expr2为真then 那么commands2 执行语句块commands2 可以有多个elif语句else else最多只能有一个commands4 执行语句块commands4fi if语句必须以单词fi终止 分支结构 if语句说明 2020年1月1日 79 commands为可执行语句块 如果为空 需使用shell提供的空命令 即冒号 该命令不做任何事情 只返回一个退出状态0 if语句可以嵌套使用 elif可以有任意多个 0个或多个 else最多只能有一个 0个或1个 if语句必须以fi表示结束 exprX通常为条件测试表达式 也可以是多个命令 以最后一个命令的退出状态为条件值 分支结构 if语句流程1 单分支 当 条件成立 时执行相应的操作 2020年1月1日 80 分支结构 if语句举例1 2020年1月1日 81 bin bash filename areyouok shecho AreyouOK readanswer 在if的条件判断部分使用扩展的test语句 在 中可以使用shell的通配符进行条件匹配if answer Yy answer Mm aybe thenecho Gladtohearit fi 分支结构 if语句流程2 双分支 当 条件成立 条件不成立 时分别执行不同操作 2020年1月1日 82 分支结构 if语句举例2 2020年1月1日 83 bin bash filename test host up or down sh if的条件部分可以使用普通的命令进行测试 当命令正确执行 0 返回真 否则 0 返回假myhost centos1 ls al meifping c1 w2 myhost dev nullthenecho myhostisUP elseecho myhostisDOWN fi 分支结构 if语句举例3 2020年1月1日 84 bin bash filename idcheck sh purpose checkuseridtoseeifuserisroot Onlyroothasauidof0 Formatforidoutput uid 9496 ellie gid 40groups 40 root suid 0 id id awk F print 2 getuserIDecho youruseridis id if id 0 id eq0 thenecho youaresuperuser elseecho youarenotsuperuser fi 分支结构 if语句流程3 多分支 针对多个条件执行不同操作 2020年1月1日 85 分支结构 if语句举例4 2020年1月1日 86 bin bash filename ask age shread p Howoldareyou age 使用Shell算术运算符 进行条件测试if age120 thenecho Outofrange exit1fi 使用多分支if语句if age 0thenecho PIV elseecho SorryIasked fi 分支结构 if语句举例5 2020年1月1日 87 bin bash filename useronline sh if语句可以嵌套使用if eq1 或 1 或 1 thenifwho grep 1 dev nullthenecho 1isactive elseecho 1isnotactive fielseecho Usage 0 exit1fi 分支结构 if语句举例6 2020年1月1日 88 bin bash filename decide file type sh if语句可以嵌套使用 ne1 thenecho Youhave rwx permissioonon file fielseecho fileisneitherafilenoradirectory fi 分支结构 case语句语法 2020年1月1日 89 caseexprin expr为表达式 关键词in不要忘 pattern1 若expr与pattern1匹配 注意括号commands1 执行语句块commands1 跳出case结构pattern2 若expr与pattern2匹配commands2 执行语句块commands2 跳出case结构 可以有任意多个模式匹配 若expr与上面的模式都不匹配commands 执行语句块commands 跳出case结构esac case语句必须以esac终止 分支结构 case语句说明 2020年1月1日 90 每个命令块的最后必须有一个双分号 可以独占一行 或放在最后一个命令的后面 所给的匹配模式pattern中可以含有通配符和 如果expr没有找到匹配的模式 则执行缺省值 后面的命令块 类似于if中的else 可以不出现 表达式expr按顺序匹配每个模式 一旦有一个模式匹配成功 则执行该模式后面的所有命令 然后退出case 分支结构 case语句流程 2020年1月1日 91 分支结构 case语句举例1 2020年1月1日 92 bin bash filename what lang do you like shecho Whatisyourpreferredscriptinglanguage echo 1 bash echo 2 perl echo 3 python echo 4 ruby echo 5 Idonotknow readlangcase langin1 echo Youselectedbash 2 echo Youselectedperl 3 echo Youselectedpython 4 echo Youselectedruby 5 exitesac 分支结构 case语句举例2 2020年1月1日 93 bin bash filename yesorno shecho n Doyouagreewiththis yesorno readyncase ynin Yy Yy Ee Ss echo Agreed Nn N n O o echo Notagreed exit1 echo Invalidinput esac 分支结构 case语句举例3 2020年1月1日 94 bin bash filename all in one backup sh Ashellscripttobackupmysql webserverandfiles opt 1case 1insql echo Runningmysqlbackupusingmysqldumptool sync echo Runningbackupusingrsynctool git echo Runningbackupusinggistoretool tar echo Runningtapebackupusingtartool echo Backupshellscriptutility echo Usage 0 sql sync git tar echo sql RunmySQLbackuputility echo sync Runwebserverbackuputility echo git Rungistorebackuputility echo tar Runtapebackuputility esac 分支结构 case语句举例4 2020年1月1日 95 bin bash filename disktest sh Thisscriptdoesaverysimpletestforcheckingdiskspace max usage LANG Cdf Ph awk print 5 grep grep vUse sort n tail 1 cut d f1 case max usage in 1 6 MSG Allisquiet 7 8 MSG Startthinkingaboutcleaningoutsomestuff MSG MSGThere sapartitionthatis space full 9 1 8 MSG Betterhurrywiththatnewdisk MSG MSGOnepartitionis space full 99 MSG I mdrowninghere There sapartitionat space MSG Iseemtoberunningwithannonexitentamountofdiskspace esacecho MSG mail s diskreport date root 流程控制 循环 2020年1月1日 96 for循环 foreach型 语法 语法说明列表list可以是命令替换 变量名替换 字符串和文件名列表 可包含通配符 每个列表项以空格间隔for循环执行的次数取决于列表list中单词的个数可以省略inlist 省略时相当于in 2020年1月1日 97 forvariableinlist 每一次循环 依次把列表list中的一个值赋给循环变量do 循环体开始的标志commands 循环变量每取一次值 循环体就执行一遍done 循环结束的标志 返回循环顶部 for循环 foreach型 流程 首先将list的item1赋给variable执行do和done之间的commands然后再将list的item2赋给variable执行do和done之间的commands如此循环 直到list中的所有item值都已经用完 2020年1月1日 98 列表中是否有元素 列表中是否有元素 variable list item next variable list item1 done结束循环 Y N doCommands Y N for for循环 foreach型 举例1 2020年1月1日 99 bin bash filename for1 constant as list sh 使用字面字符串列表作为WordListforxincentosubuntugentooopensusedoecho x done 若列表项中包含空格必需使用引号括起来forxinLinux GnuHurd FreeBSD MacOSX doecho x doneforxinls df h du sh doecho x eval xdone forxin centos ubuntu gentoo opensuse forxin centosubuntugentooopensuse 比较 for循环 foreach型 举例2 2020年1月1日 100 bin bash filename for2 variable as list sh 使用变量作为WordListi 1 weekdays MonTueWedThuFri fordayin weekdays doecho Weekday i day doneOSList Linux GnuHurd FreeBSD MacOSX forxin OSListOthers doecho x done fordayin weekdays fordayin weekdays 比较 for循环 foreach型 举例3 2020年1月1日 101 bin bash filename for3 pp as list sh 使用位置参数变量 作为WordList in 可以省略i 1forday doecho n Positionalparameter i day case dayin Mm on Tt ue Ww ed Tt hu Ff ri echo weekday Ss at Ss un echo WEEKEND echo Invalidweekday esacdone for3 pp as list shMonTuewed
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中女生德育大会课件
- 高三复习离子反应课件
- 2025-2026学年沪教版(2024)小学美术二年级上册(全册)教学设计附目录P175
- 夫妻离婚不离家共同处理婚姻关系及子女监护权协议
- 离婚协议范本:婚姻解除后的财产分割与子女监护协议
- 签订即编制明确的医疗机构检验科人员合作协议
- 汽车制造生产车间劳务承包与质量控制合同
- 离婚纠纷调解协议书范本:财产分割与子女抚养
- 离婚后房屋产权变更与共同财产分割执行合同
- 广告内容合规审核代理合同
- 肌肉注射技术试题及答案
- 马工程西方经济学(精要本第三版)教案
- GSP药品经营质量管理规范培训
- 太平间合同协议
- 网吧网管硬件技术培训手册
- 医院运送协议合同
- 拆炉机管理制度
- 企业事故隐患内部报告奖励制度
- 医药行业公关案例
- 老年贫血患者的护理课件
- 集团公司特种设备的管理台账及记录表格
评论
0/150
提交评论