




已阅读5页,还剩80页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Shell程序设计 Shell的特点 1 把已有命令进行组合 构成新的命令 组合方式简单2 可以用 进行模式匹配3 可以直接用shell内置命令 而不需创建新进程cdechoexitpwdkill等4 支持通配符 输入 输出重定向 管道等非常方便 5 结构化6 可后台运行 7 可配置环境8 提供了高级命令语言 shell脚本可把可执行程序和命令结合起来当做新的命令使用 脚本示例 bin shecho Isitmorning Pleaseansweryesorno readtimeofdayif timeofday yes thenecho Goodmorning elseecho Goodafternoon fiexit0 Shell程序设计的基本步骤 了解问题与需求 掌握shell命令 将问题转换为已知的shell命令 可能需要将众多shell命令组装在一起 或者将它们编成脚本文件 以便多次使用 编辑器用来编写脚本文件的 如vi Emacs特点 环境变量与shell Shell程序不用编译与连接 是由shell来解释 找到相关指令文件或者代码段 执行 Shell查找命令是在PATH环境变量指出的各个目录中查找命令相关执行文件 或者是内部命令 如果都没有 则出错 Shell脚本运行的方法 1 首先必须修改文件的模式 添加执行权限 chmod xcript file name再在命令提示符下输入脚本文件名 即可执行2 将其作为调用shell的参数 bin shcript file name3 找不到文件的解决方法 写出全路径或者相对路径 如 cript file name 或者将脚本文件所在路径添加进PATH环境中 该方法存在安全隐患 方法如下 PATH newpath PATH exportPATH InteractivePrograms forfilein do ifgrep lPOSIX file then more file fi doneposixThisisafilewithPOSIXinit treatitwell CreatingaScript bin sh first Thisfilelooksthroughallthefilesinthecurrent directoryforthestringPOSIX andthenprintsthenamesof thosefilestothestandardoutput forfilein doifgrep qPOSIX filethenecho filefidoneexit0 Shell语法 变量 字符串 数字 环境以及参数条件控制结构 分支 循环 命令列表函数内置命令命令执行结果获取Here文档 变量 使用与声明没有分开 也不是需先声明才能使用 而是使用时即刻创建 所有变量 的值 都看作字符串存储 在需要的时候shell或者工具程序将它们转换为数值等类型 变量名大小写区分aNum 10 anum 18获取变量值的方法 在变量前加 aNum anum echo aNum 正确 输入 输出 read echo readprice echo price 变量的使用 school AHUT echo school1 AHUT school2 AHUT echo school2 AHUT school AnhuiUniversity echo school AnhuiUniversity school 1 2 echo school 1 2 本地变量 本地变量在用户现在的shell生命期的脚本中使用 例如 本地变量file name取值为loop doc 这个值只在用户当前shell生命期有意义 如果在shell中启动另一个进程或退出 此值将无效 这个方法的优点就是用户不能对其他的shell或进程设置此变量有效 引号 引号的使用双引号的重要性单引号反引号反斜杠 使用引号 含有空白字符的字符串需要使用双引号 VarName放在双引号之中 shell仍然将其替换为它的值 放在单引号之中 不发生替换 string Day Month Year echo string Day Month Year echo string Day Month Year echo string string 双引号的重要性 在 etc passwd文件中查找DaveyWiregrep DaveyWire etc passwd如果误写为grepDaveyWire etc passwd这是指在Wire以及 etc passwd文件中查找Davey字符串 单引号 与双引号类似 但是不会替换引号中变量值 甚至可以被包含在双引号之中 str Iam stu inahut echo str Iam stu inahutstr Iam stu inahut 有的系统的Shell以为还有内容没有输完 出错 如果需要进一步处理 可以按Ctrl C终止 反引号 反引号用于设置系统命令的输出到变量 shell将反引号中的内容作为一个系统命令 并执行其内容 使用这种方法可以替换输出为一个变量 反引号可以与引号结合使用 在键盘左上角 echo date WedFeb2021 16 17CST2008 mydate date echo mydate WedFeb2021 18 17CST2008 echo Nowtimeis date NowtimeisWedFeb2022 18 17CST2008 反斜杠 屏蔽特殊含义的字符 转义 echo 是指串行列出当前目录下的 非隐藏 文件以及目录名 echo echo 3456 echo 环境变量 Brourneshell有一些预留的环境变量名 这些变量名不能用作其他用途 通常在 etc profile中建立这些嵌入的环境变量 但也不完全是 这取决于用户自己 以下是嵌入shell常见预定义的变量列表 参数变量 位置参数变量特殊参数变量 位置参数变量 表示向运行脚本传递的参数序列 从 0开始从左到右依次递增 如向脚本传递参数DidYouSeeTheFullMoon 位置参数列表序列如下 其中 0即是脚本程序名 因而它总是有值的 bin shsalutation Hello echo salutationecho Theprogram 0isnowrunning echo Thesecondparameterwas 2 echo Thefirstparameterwas 1 echo Theparameterlistwas echo Theuser shomedirectoryis HOME echo Pleaseenteranewgreeting readsalutationecho salutationecho Thescriptisnowcomplete exit0 try varfoobarbaz 特殊参数变量 只要指运行时的一些相关控制信息 这就是特定变量的由来 条件 写脚本时 有时要判断字符串是否相等 可能还要检查文件状态或是数字测试 基于这些测试才能做进一步动作 test命令用于测试字符串 文件状态和数字 它还经常和if then else条件结构结合使用 格式testcondition测试或者 condition测试 ls l usr bin lrwxrwxrwx1rootroot4Oct1310 46 usr bin testiftest ffred cthen fiif ffred c then fi 字符串测试 两个字符串相等 两个字符串不等 z空串 n非空串 字符串测试实例 z s echo 0 s a z s echo 1 unsets z s echo 0 字符串测试实例 Str1 dev hda1 Str2 dec hda2 str1 str2 echo 1 Str2 dev hda1 str1 str2 echo 0 算术测试 eq数值相等 ne数值不相等 gt第一个数大于第二个数 lt第一个数小于第二个数 le第一个数小于等于第二个数 ge第一个数大于等于第二个数 算术测试实例 num 130 num eq 150 echo 1 num2 30 num gt num2 echo 0 expr 算术式 用来表达算术运算式子 并求结果 expr3 5 8 expr3 5 2 expr6 4 2expr6 424 注意要有空格 测试文件 d 目录为真 e 文件存在为真 有移植问题 f 普通文件为真g SGID被设为真 r 可读为真 s 长度不为0为真 u SUID被设为真 w 可写为真 x 可执行为真 控制结构 流控制 分支控制 if then else elif case循环 while do until for if if语句测试条件 测试条件返回真 0 或假 1 后 可相应执行一系列语句 if语句结构对错误检查非常有用 可以没有elif分支其格式为 if条件1then命令1elif条件2then命令2else命令3then命令3fi then可以是放在条件1后面 并以 与它分隔 if各部分功能 If条件1 如果条件1为真Then 那么命令1 执行命令1elif条件2 如果条件1不成立 条件2成立then 那么命令2 执行命令2else 如果条件1 2均不成立命令3 那么执行命令3fi 完成 if语句必须以单词fi终止 在if语句中漏写fi是最一般的错误 elif和else为可选项 如果语句中没有否则部分 那么就不需要elif和else部分 if语句可以有许多elif部分 最常用的if语句是ifthenfi结构 简单if实例 注意 语句可以不这样缩排 但建议这样做 因为可以增强脚本的清晰程度 在条件流下采取命令操作更方便 该例子测试10是否小于12 此条件当然为真 因为条件为真 if语句内部继续执行 这里只有一个简单的echo命令 如果条件为假 脚本退出 因为此语句无else部分 bin shecho Isitmorning Pleaseansweryesorno readtimeofdayif timeofday yes thenecho Goodmorning elseecho Goodafternoon fiexit0Isitmorning PleaseansweryesornoyesGoodmorning bin shecho Isitmorning Pleaseansweryesorno readtimeofdayif timeofday yes thenecho Goodmorning elif timeofday no thenecho Goodafternoon elseecho Sorry timeofdaynotrecognized Enteryesorno exit1fiexit0 bin shecho Isitmorning Pleaseansweryesorno readtimeofdayif timeofday yes thenecho Goodmorning elif timeofday no thenecho Goodafternoon elseecho Sorry timeofdaynotrecognized Enteryesorno exit1fiexit0 变量值测试 通过测试设置为接受用户输入的变量可以测知用户是否输入信息 下面的例子中测试用户键入return键后变量name是否包含任何信息 grep输出检查 grep输出检查不必拘泥于变量或数值测试 也可以测知系统命令是否成功返回 对grep使用if语句找出grep是否成功返回信息 下面的例子中grep用于查看Dave是否在数据文件data file中 注意 Dave 用于精确匹配 用变量测试grep输出 用变量测试grep输出 可以用grep作字符串操作 下面的脚本中 用户输入一个名字列表 grep在变量中查找 要求其包含人名Peter 文件拷贝输出检查 下面测试文件拷贝是否正常 如果cp命令并没有拷贝文件myfile到myfile bak 则打印错误信息 注意错误信息中 basename 0 打印脚本名 如果脚本错误退出 一个好习惯是显示脚本名并将之定向到标准错误中 用户应该知道产生错误的脚本名 bin shifcpmfmy2 dev null2 thenecho cpfine elseecho cperror fiexit0 测试传递到脚本中的参数 if语句可用来测试传入脚本中参数的个数 使用特定变量 表示调用参数的个数 可以测试所需参数个数与调用参数个数是否相等 以下测试确保脚本有三个参数 如果没有 则返回一个可用信息到标准错误 然后代码退出并显示退出状态 如果参数数目等于3 则显示所有参数 将脚本参数传入系统命令 测试目录是否为空 另外的一个版本 目录为空测试 测试目录创建结果 脚本接受一个参数 并用之创建目录 然后参数被传入命令行 重设给变量DIRECTORY 测试变量是否为空 if DIRECTORY 也可以用if lt1 来进行更普遍的参数测试 如果字符串为空 返回一可用信息 脚本退出 如果目录已经存在 脚本从头至尾走一遍 什么也没做 创建前加入提示信息 如果键入Y或y 则创建目录 否则使用空命令表示不采取任何动作 使用最后命令状态测试创建是否成功执行 如果失败 返回相应信息 测试目录创建结果 case case语句为多选择语句 可以用case语句匹配一个值一个模式 如果匹配成功 执行相匹配的命令 case语句格式如下 case值in模式1 命令1 模式2 命令2 esac case的in取值 取值后面必须为单词in 每一模式必须以右括号结束 取值可以为变量或常数 匹配发现取值符合某一模式后 其间所有命令开始执行直至 取值将检测匹配的每一个模式 一旦模式匹配 则执行完匹配模式相应命令后不再继续其他模式 如果无一匹配模式 使用星号 捕获该值 再接受其他输入 case的模式匹配 模式部分可能包括元字符 与在命令行文件扩展名例子中使用过的匹配模式类型相同 即 任意字符 任意单字符 类或范围中任意字符 简单的case语句 提示用户输入1 5中的一个数字 根据用户的输入数据a 输出 youhaveselecta 的信息 bin shecho Pleaseenteranumberbetween1and5 readnumcase num in1 echo youhaveselect1 2 echo youhaveselect2 3 echo youhaveselect3 4 echo youhaveselect4 5 echo youhaveselect5 echo Sorry youtypeawrongnumber esacexit0 简单的case语句 脚本提示输入1到5 输入数字传入case语句 变量ANS设置为case取值 测试变量ANS ANS将与每一模式进行比较 如果匹配成功 则执行模式里面的命令直至 这里只反馈用户数字选择的信息 然后case退出 因为匹配已找到 进程在case语句后仍可继续执行 如果匹配未找到 则使用 模式捕获此情况 这里执行错误信息输出 注意与高级程序设计语言case的区别 对匹配模式使用 使用case时 也可以指定 符号作为或命令 例如vt100 vt102匹配模式vt100或vt102 实例case的一个有效用法是提示用户响应以决定是否继续 提示输入y以继续处理 n退出 如果用户输入Y y或yes 处理继续执行case语句后面部分 如果用户输入N n其他响应 用户退出脚本 bin shecho n Doyouwishtoproceed y n readyesnocase yesno iny Y yes YES echo Youselectyes n N no NO echo Youselectno echo basename 0 Sorryyoutypeawronganswer exit1 esacexit0 case与命令参数传递 可以使用case控制到脚本的参数传递 先测试特定变量 它包含传递的参数个数 假如是一个参数的脚本 则 如果不等于1 退出并显示可用信息 然后case语句捕获参数并进行各种模式匹配 相对于每一种匹配模式执行进一步处理脚本 如果均不匹配 显示可用信息到标准错误输出 bin shif 1 echo Usage basename 0 Start stop help exit1fiOPT 1case OPTinstart echo starting stop echo stopping help echo stopping echo Usage basename 0 Start stop help exit1esacexit0 for for循环一般格式为 for变量名in列表do命令1命令2 done for 当变量值在列表里 for循环即执行一次所有命令 使用变量名访问列表中取值 命令可为任何有效的shell命令和语句 变量名为任何单词 in列表用法是可选的 如果不用它 for循环使用命令行的位置参数 in列表可以包含替换 字符串和文件名 简单for 一 bin shforbooinbudbrotherfathermdoecho boodoneexit0 budbrotherfatherm 简单for 二 bin shforloopin12345doecho loop doneexit0 打印字符串列表 bin shforstrin HelloWorld doecho str doneexit0 bin shforstrinHelloWorlddoecho str doneexit0 对for循环使用ls命令 bin shforstrin ls doecho stroflscommand doneexit0 对for循环使用参数 在for循环中省去in列表选项时 它将接受命令行位置参数作为列表 实际上即指明 forparamsin 或forparamsin bin shforparamdoecho Youhaveparameters param doneexit0 该例子使用in列表选项 for显示的循环查看参数 或 以从命令行中取得参数 bin shforparamin doecho Youhaveparameters param doneecho paramexit0 使用for循环连接服务器 因为for循环可以处理列表中的取值 现设变量为网络服务器名称 for循环连接每一服务器 bin shHOST itsevrdnssevracctmainladpd forhostin HOSTdoecho Nowconnectro host ping c2 hostdoneexit0 for循环嵌入 嵌入循环可以将一个for循环嵌在另一个for循环内 for变量名1in列表1dofor变量名2in列表2do命令1 donedone 嵌入for循环 假如服务器 app目录下有accts claims stock以及serv等若干个应用 每个该应用要进行审计 运行报告以及清理管理 再假设审计 audit check 运行 report run 以及清理 cleanup 管理脚本已经编写好 要求将管理结果保存到文件中 使用 使其在后台运行 其一般用法是 命令 使用tee命令是在登录文件上放一条目 它的一般用法是 tee a文件名 bin shapps app accts app claim app stock app serv scripts audit checkreport runcleanup time date LOGFILE audit logecho timeforapplicationin appsdoformangin scriptsdoecho Now applicationwasdoneby sriptsat time tee a LOGFILE application mang donedoneexit0 运行实例 until循环 until循环执行一系列命令直至条件为真时停止 until循环与while循环在处理方式上刚好相反 一般while循环优于until循环 until适合于当某种事件发生则进行进一步处理的场合 until循环格式为 until条件命令1 do
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黑龙江地区中石化2025秋招面试半结构化模拟题及答案油气储运与管道岗
- 中国联通来宾市2025秋招供应链采购类专业追问清单及参考回答
- 小学语文必知的52组神话故事成语+歇后语释义
- 自贡市中石化2025秋招面试半结构化模拟题及答案安全环保与HSE岗
- 恩施自治州中石油2025秋招笔试模拟题含答案油气储运与管道岗
- 2025年内经选读考试试题及答案
- 阿拉善盟中石油2025秋招面试半结构化模拟题及答案炼油工艺技术岗
- 辽阳市中石化2025秋招笔试综合知识专练题库及答案
- 丽江市中石化2025秋招笔试模拟题含答案市场营销与国际贸易岗
- 国家能源资阳市2025秋招笔试思维策略题专练及答案
- 2025至2030年中国热泵控制器行业市场竞争现状及投资战略研判报告
- 浅蓝色简约风工作总结
- 2025年新高考1卷(新课标Ⅰ卷)语文试卷
- 竞彩资格考试题库及答案
- 妇科专业疾病临床诊疗规范2025年版
- 2025年自学考试《00504艺术概论》考试复习题库(含答案)
- T/CHES 117-2023城市河湖底泥污染状况调查评价技术导则
- 平安医院建设试题及答案
- 专项项目贡献证明书与业绩认可函(8篇)
- 2025年广东省广州市中考二模英语试题(含答案)
- 消防员心理测试题库及答案解析
评论
0/150
提交评论