第8章 Shell编程.ppt_第1页
第8章 Shell编程.ppt_第2页
第8章 Shell编程.ppt_第3页
第8章 Shell编程.ppt_第4页
第8章 Shell编程.ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UNIX操作系统 UNIX操作系统 第八章Shell编程 2 第八章Shell编程 什么是Shell脚本 什么时候需要Shell脚本 如何编写一个Shell脚本 UNIX操作系统 第八章Shell编程 3 问题的提出 Top软件开发公司的开发人员Tom在调试程序的过程中遇到了一个令人烦恼的问题 在运行一个用C语言编写的应用程序的时候 该程序需要读取一个包含当前时间值的文本文件 该文件的格式必须为 第1行是 月 日 年 第2行是 时 分 UNIX操作系统 第八章Shell编程 4 问题的提出 date命令的默认显示格式是 星期月日时 分 秒时区年 因此 Tom每次运行程序前 都要手工修改该数据文件 即先运行date命令 再修改数据文件 最后运行该应用程序 而且从运行date命令到运行该应用程序最长时间不应该超过1分钟 否则就要重新修改数据文件 UNIX操作系统 第八章Shell编程 5 问题分析 有两种传统的方法可以完成对该数据文件的修改 1 使用文本编辑器 2 使用组合命令date cut f2 3 6 d tr data txtdate cut f4 d cut f1 2 d data txt UNIX操作系统 第八章Shell编程 6 问题分析 这两种方法都存在一些缺点 不够理想 事实上 可以采用编写Shell脚本的方式完成此任务 UNIX操作系统 第八章Shell编程 7 认识Shell脚本 可以把若干个命令保存到一个文本文件 然后使用该文件的名字一次执行所有的命令 这样的文本文件称为Shell脚本 ShellScript 以下简称脚本 caldatecd HOMEls l caldatecd HOMEls l Show sh UNIX操作系统 第八章Shell编程 8 认识Shell脚本 Shell程序的特点 shell程序就是一些shell命令组合成的一个文本文件 对语句逐行解释然后执行 各种shell bsh csh ksh bash 都可以进行程序设计 因为bsh作为程序设计语言的功能非常强大而且执行速度快 所以在shell程序设计中 bsh是使用最为广泛的 本节我们主要介绍bsh的程序设计 UNIX操作系统 第八章Shell编程 9 shell程序的执行 执行的方法有三种 1 利用输入重定向 sh show sh2 用sh调用 shshow sh3 直接执行 show sh UNIX操作系统 第八章Shell编程 10 shell程序的执行 我们知道要执行一个文件 它必须要有可执行的权限 因为脚本文件是一个文本文件 通常用vi来创建 这些文本文件默认的权限是rw r r 即无论谁都没有执行权 所以在执行这些文件前要先改变文件的权限 增加执行权 chmodu xshow sh增加属主的执行权 chmodg xshow sh增加组员的执行权 chmodo xshow sh增加其他用户的执行权 chmoda xshow sh增加所有用户的执行权 UNIX操作系统 第八章Shell编程 11 shell程序的执行 问题 当直接执行某个shell程序时到底由哪个shell来执行呢 可以在程序中指明由哪种shell执行 指定方式如下所述 如果Script的第一个非空白字符不是 则它会使用BourneShell 2 如果Script的第一个非空白字符是 时 但不以 开头时 则它会使用CShell 3 在 後面指定所使用的Shell 而且要将整个路径名称指出来 BourneShell的路径名称为 bin sh 而CShell则为 bin csh bin sh bin csh UNIX操作系统 第八章Shell编程 12 编程基础 1 注释在代码中加入注释是一个良好的习惯 便于以后自己或其他人进行维护 Shell中将 以后的字符作为注释 programetest注释行pwd list在行中间的注释 UNIX操作系统 第八章Shell编程 13 编程基础 2 shell变量shell变量只有字符型一种类型 程序中出现的数字也当作字符处理 这是shell程序设计语言和一般的程序设计语言的重要不同之处 变量名遵循与文件名同样的规则 由字母 数字和下划线组成 但必须以字母开头 BourneShell有如下四种变量 用户自定义变量位置变量即shellscript之参数预定义变量 特殊变量 环境变量 参考shell定制部分 UNIX操作系统 第八章Shell编程 14 编程基础 1 变量赋值shell变量不需要定义 使用时直接用 给变量赋值 ux UNIXhi Howareyou 注意 传统的Bshell在变量赋值时 两边不允许有空格 但一些改进的shell如bash允许 两边都有或都无空格 技巧 因为大部分UNIX命令使用小写字符 因此在shell编程中通常使用全大写变量 当然这并不是强制性的 但使用大写字符可以在编程中方便地识别变量 UNIX操作系统 第八章Shell编程 15 编程基础 2 删除变量使用unset命令删除变量 un unix echo ununix unsetun echo un UNIX操作系统 第八章Shell编程 16 编程基础 3 变量的访问欲访问变量的值 可在变量名前加 号 echo uxUNIX echo abc如果变量未赋值则为一个空串在变量取值时可以用 把变量括起来 以便强调指出变量名 echo ux UNIX echo ux tmUNIXtm取ux的值并和tm组合 echo hi todayHowareyoutoday取hi的值并和today组合 UNIX操作系统 第八章Shell编程 17 编程基础 4 变量替换利用双引号进行变量替换 echo ux tm利用双引号对变量ux进行变量替换并和tm组合UNIXtm echo hi todayHowareyoutoday单引号和双引号的区别在于 引号内如果有特殊字符时 单引号会使其失去特殊含义 而双引号在遇到 等特殊字符时 会进行变量替换 echo ux tm uxtm UNIX操作系统 第八章Shell编程 18 编程基础 5 变量的作用域作用域即作用范围 一般情况 变量仅在给它赋值的那个shell中起作用 ux UNIX为变量ux赋值 echo ux显示变量ux的值UNIX sh创建一个子shell进程 echo ux 在子shell中访问变量ux ux的值未带到子进程 为空串 exit退出子shell UNIX操作系统 第八章Shell编程 19 编程基础 如果要使变量在其它的子shell中也有效 就要使用export命令 使之成为全局变量 echo ux exportux使变量变成全局变量 sh再创建一个子shell进程 echo ux在子shell中访问变量UNIXux的值从父进程带到子进程 exit退出子进程 UNIX操作系统 第八章Shell编程 20 编程基础 6 位置变量位置参数是当script被载入时 後面所附加的参数 shell脚本可以从命令行读取10个参数并送到指定的变量保存 这些变量就是位置变量 这些参数按顺序被命名为 0 1 9 testabcdefghi 0 1 2 3 4 5 6 7 8 9 UNIX操作系统 第八章Shell编程 21 编程基础 其他的位置变量 UNIX操作系统 第八章Shell编程 22 编程基础 位置变量应用的例子 catarguecho Thisistheoutputof 0script echo Totalnumberofparameters echo Thefirstparameters 1 echo Thesecondparameters 2 echo Allparameters argu无参数执行 arguonetwo包含两个参数执行 UNIX操作系统 第八章Shell编程 23 编程基础 7 几个由系统自动赋值的变量有几个shell变量是由系统自动赋值的 它们在shell的程序设计中非常重要 UNIX操作系统 第八章Shell编程 24 编程基础 echo 如果前一个程序运行正确则为0 否则为1 ps a grepbash1635p1S0 00 bin bash echo 1635 UNIX操作系统 第八章Shell编程 25 编程基础 8 Shell变量的算术运算我们知道 shell变量是字符型的变量 如果它的取值是数字 可否进行算术运算呢 int 0变量int赋值 int int 1企图给int加1 echo int0 1结果是字符串的连接 并未实现加1运算 UNIX操作系统 第八章Shell编程 26 编程基础 要想对shell变量进行数字运算 可以使用expr命令 格式 expr整数操作符整数其中操作符为 取余 expr4 5注意 1 操作数和运算符之间要用空格分开 这是因为变量是字符类型 如果不用空格 便会被认为是同一个字符串 2 操作数只能是整数 UNIX操作系统 第八章Shell编程 27 编程基础 expr4 5由于 和 在shell中有特殊意义 所以需要做转义处理 如 expr4 5 expr4 5 expr4 520 expr 4 5 4 5 UNIX操作系统 第八章Shell编程 28 编程基础 欲将int的值加1 int初值为0 expr int 1 echo int可使用反引号进行命令替换 echoTodayis date TodayisMonApr1516 20 13CST1999 int expr int 1 echo int UNIX操作系统 第八章Shell编程 29 参数的传递 shell的程序分为有参程序和无参程序 Subtest rAsInteger cAsInteger test r cEndSubPrivateSubForm Load DimaasInterger a test 6 8 EndSub Subtest rAsInteger cAsInteger a test 6 8 Form1 实参 形参 UNIX操作系统 第八章Shell编程 30 参数的传递 在执行shell有参程序时也需要向程序传递参数 可通过命令行参数以及交互式输入变量 read 1 通过命令行参数 testabcdefghi 0 1 2 3 4 5 6 7 8 9 catarguecho Thisistheoutputof 0script echo Totalnumberofparameters echo Thefirstparameters 1 echo Thesecondparameters 2 echo Allparameters argu无参数执行 arguonetwo包含两个参数执行 UNIX操作系统 第八章Shell编程 31 参数的传递 2 read命令read命令可以将用户的输入作为参数传递到程序中 程序根据用户的输入来执行 类似于c语言中的scanf函数的功能 特别适用于交互式的程序设计 main printf 请输入一个数 scanf d UNIX操作系统 第八章Shell编程 32 参数的传递 catread test1echo Inputyourname c readname获取用户输入赋给name变量echo Yournameis name 注意 把变量用引号括起来是一个好习惯 可以防止把用户输入的特殊符号如 等解释成元字符 UNIX操作系统 第八章Shell编程 33 参数的传递 下面看一下如何输入多个变量 catread test2echo Inputyourname c readname1name2otherecho Yournameis n name1 name2 n other 说明 read命令将第一个字赋给第一个变量 第二个字赋给第二个变量 依次类推 如果输入的变量多于存储的变量 则将所以剩余的都赋给最后一个变量 UNIX操作系统 第八章Shell编程 34 流程控制 shell编程和c语言一样采用的是结构化的程序设计方法 整个程序由三种基本结构 顺序 选择 循环 组成 因此shell中也提供了流程控制的语句 通过它们可以编写非常复杂的程序 UNIX操作系统 第八章Shell编程 35 流程控制 1 选择结构同C语言一样 shell也用if语句表示选择结构 1 if语句 类型1 ifconditionthencommandfi 类型1 UNIX操作系统 第八章Shell编程 36 流程控制 1 if语句 类型2 ifconditionthencommand1elsecommand2fi 类型2 UNIX操作系统 第八章Shell编程 37 流程控制 1 if语句 类型3 ifcondition1thencommand1elifcondition2thencommand2elsecommand3fi 类型3 UNIX操作系统 第八章Shell编程 38 流程控制 if语句实例 类型1 ifconditionthenvifilefi UNIX操作系统 第八章Shell编程 39 流程控制 2 test命令在上面的if语句中 需要对条件表达式进行测试 根据测试的结果 相应执行不同的操作 这要借助test这个测试命令来完成 格式 testexpr或 expr test将测试expr表达式 如果为 真 则返回0 否则 返回非0值 注意 自己编写的程序不要命名为test UNIX操作系统 第八章Shell编程 40 流程控制 test命令的功能 1 用于对文件的测试2 用于对字符串的进行测试3 用于对整数进行测试4 tese测试的逻辑组合5 进行test测试的标准方法 UNIX操作系统 第八章Shell编程 41 流程控制 3 case语句利用if语句可以实现二选一的选择结构 在编程时经常会遇到多选一的情况 如果要用if实现就需要嵌套 更好的方法是使用case语句 它是专门为多选一的分支结构设计的 形式上更简洁 UNIX操作系统 第八章Shell编程 42 流程控制 3 case语句格式如下 case arginpattern1 command1 pattern2 command2 command3 default esac说明 arg是引入的参数 系统将它和各个模式依次比较 如果arg内容符合某个模式的话 便会执行该模式下的代码 每一模式的代码必须以两个分号 做结尾 通常把最后一个模式置为 这样 如果所以模式都不匹配 可以执行一个缺省的命令 UNIX操作系统 第八章Shell编程 43 流程控制 例 将上节例2改为由case语句实现 bin sh case2hour date cut c12 13 取date执行结果的第12和第13个字符 即小时数case hourin 118esac UNIX操作系统 第八章Shell编程 44 流程控制 2 循环结构循环结构是三种基本结构之一 当需要对某些命令进行反复执行时 可以使用循环结构 1 for循环用于循环次数确定的情况格式 forvar inword1word2 wordn docommanddone说明 var可能的取值word1word2 wordn必须一一列出 UNIX操作系统 第八章Shell编程 45 流程控制 例1 bin sh for1foriinabcdefdoecho idone它将会显示出a到f UNIX操作系统 第八章Shell编程 46 流程控制 例2 另一种用法 显示a f bin sh for2WORD abcdef foriin WORDdoecho idone这个Script将会显示a到f UNIX操作系统 第八章Shell编程 47 流程控制 例3 当输入 for3 时会如何 bin sh for3foriin bin doecho idone当您输入 for3 时 其作用就跟 ls bin 一样 UNIX操作系统 第八章Shell编程 48 流程控制 如果 inword 省略掉 那麽var将会被设定为Script後面跟的参数 这是经常用到的结构 例4 当输入 for4file1file2 时会如何 bin sh for4fori 等价于foriin docat idone当您输入 for4file1file2 时 其作用就跟 catfile1file2 一样 UNIX操作系统 第八章Shell编程 49 流程控制 2 while循环和until循环 当型循环 当条件为真时执行循环体 whileconditiondocommandsdone 直到型循环 当条件为假时执行循环体 直到为真才退出 untilconditiondocommandsdone UNIX操作系统 第八章Shell编程 50 流程控制 例1 结果如何 bin sh while1number 0while test number lt10 doecho number c number expr number 1 doneecho n 结果如下 0123456789 UNIX操作系统 第八章Shell编程 51 流程控制 例2 当指定的文件被删除时给出提示 bin sh while2whiletest f 1 检查被指定的文件是否存在dosleep2 停止2秒 相当于每2秒检测一次doneecho file 1doesnotexist exit0 退出脚本程序如果在前台执行该程序 而检测的文件没有被删除 则程序一直运行 用户无法使用该终端 解决的方法是在后台运行 while2file1 UNIX操作系统 第八章Shell编程 52 流程控制 将上例改为until型 untiltest f 1 当被指定的文件存在时退出循环dosleep2 停止2秒 相当于每2秒检测一次doneecho file 1doesexist exit0 退出脚本程序 UNIX操作系统 第八章Shell编程 53 流程控制 3 break及continue这两者是用於for while until等循环控制下 break会跳出循环 而continue只会跳出本次循环 继续执行下次循环 UNIX操作系统 第八章Shell编程 54 shell程序的调试 shell语言是解释型语言而不是编译型语言 所以不能象其他语言 如C语言 那样可以使用编译程序进行查错 下面介绍两种可用的调试方法 1 交互调试由于shell程序是逐条解释执行的 因此我们可以把要调试的语句直接键入执行 判断是否正确 UNIX操作系统 第八章Shell编程 55 shell程序的调试 2 跟踪调试 P24911 6节 使用带选项的sh命令可以对程序进行跟踪 选项如下 UNIX操作系统 第八章Shell编程 56 shell程序的调试 1 全局跟踪全局跟踪就是对shell程序的每个语句都进行跟踪 现有一个程序mytest catmytestdateecho PATH采用 v对mytest跟踪 执行结果如下 sh vmytestdate显示命令FriAug816 00PRC1997显示命令执行结果echo PATH显示命令 变量未替换 usr bin 显示命令执行结果 UNIX操作系统 第八章Shell编程 57 shell程序的调试 sh xmytest date显示命令FriAug816 00PRC1997显示命令执行结果 echo usr bin 显示命令 变量已替换 usr bin 显示命令执行结果 UNIX操作系统 第八章Shell编程 58 shell程序的调试 2 局部跟踪如果我们只对程序中的一部分语句进行跟踪 可以采用局部跟踪 局部跟踪通过set命令设置跟踪的范围 例 上例中仅对date语句进行跟踪 可将程序改为 catmytestset v 开启跟踪datesetv 关闭跟踪echo PATH执行mytest程序 shmytestdate显示命令FriAug816 00PRC1997显示命令执行结果 usr bin home xy bin显示命令执行结果 UNIX操作系统 第八章Shell编程 59 shell程序的调试 3 n选项该选项检查程序的语法错误但不执行程序 可以在运行程序前先检查是否有语法错误 catcheckif gt0 参数个数 0 写掉了一个thenecho Numberofarguments elseecho Noarguments fi sh ncheckcheck syntaxerroratline3 else unexpected UNIX操作系统 第八章Shell编程 60 使用终端功能 在shell程序中往往需要模拟终端的操作 比如通过shell程序移动光标位置等 这要借助tput命令 UNIX操作系统 第八章Shell编程 61 使用终端功能 选项功能bel响铃blink闪烁显示bold粗体显示clear清屏dim显示变暗 选项功能smso启动突出模式smul启动下划线模式rmso结束突出模式rmul结束下划线模式rev反白显示 ed从光标位置移动到屏幕底部el清除从光标到行末的字符cuprc把光标移动到r行c列sgr0关闭所有属性 UNIX操作系统 第八章Shell编程 62 使用终端功能 例1 先清屏 然后在10 20显示1234 tputclear tputcup1020 echo 1234 UNIX操作系统 第八章Shell编程 63 使用终端功能 例2 更复杂的例子 s tputsmul 保存启动下划线模式的代码 r tputrmul 保存结束下划线模式的代码 tputclear清屏 tputcup1020设置光标位置 echo s启动下划线模式 echo showinformation 显示带下划线的字符 echo r关闭下划线模式 UNIX操作系统 第八章Shell编程 64 菜单驱动的shell程序 菜单系统能给用户提供直观简便的操作界面 因此也是最常用的程序界面 菜单实际上是提供多个选项供用户选择 用基本结构表示就是一个分支结构 并且还是一个多选一的结构 因此可以通过case语句来实现 UNIX操作系统 第八章Shell编程 65 echo ListDirectory 1 echo Showdateandtime 2 echo ShowCalendar 3 echo ExitMenu 4 echo Inputyourchoice c readchoicecase choicein1 ls 2 date 3 cal q Q 4 echoGoodbye echoillegalOptionesac whiletruedo done 如何让菜单始终处于运行状态 UNIX操作系统 第八章Shell编程 66 菜单驱动的shell程序 设计一个较为复杂的shell程序作为这一章的结束 这个shell程序由菜单驱动 用于管理学生的信息 用户可以增加 修改 删除和查询学生信息 程序系统结构图 UNIX操作系统 第八章Shell编程 67 USTU学生信息管理程序 USTU初始界面 UNIX操作系统 第八章Shell编程 68 USTU学生信息管理程序 USTU主菜单界面 UNIX操作系统 第八章Shell编程 69 流程控制 1 用于对文件的测试格式 test 选项 file ffile文件file存在且为普通文件例 test f home xy file1该命令测试file1是否是普通文件 如果是 命令正常返回 返回状态为0 怎样才能看到命令的返回值呢 echo 是上一条命令返回的状态0 dfile文件file存在且为目录 test d home xy echo UNIX操作系统 第八章Shell编程 70 流程控制 其他用于文件测试的选项 P236表11 6 bfile文件file存在且为块设备文件 cfile文件file存在且为字符设备文件 dfile文件file存在且为目录 efile文件file存在 ffile文件file存在且为普通文件 rfile用户对文件file有读权限 wfile用户对文件file有写权限 xfile用户对文件file有可执行权限 sfile文件file存在且大小不为零 UNIX操作系统 第八章Shell编程 71 流程控制 2 用于对字符串的进行测试 P235表11 5 teststr1 str2二者相同 号两边要有空格 这与sh的变量赋值相反teststr1 str2二者不同 号两边要有空格test nss不为空 长度不为零 test zss为空testss不为空 UNIX操作系统 第八章Shell编程 72 流程控制 例 str1 abcd test str1 abcd echo 0 str1 abcd test str1 abcd echo 1 test str1 abcd echo 0 注意 在test处理含有空格的变量时最好用引号将变量括起来 否则会出现错误的结果 因为shell在处理命令行时将会去掉多余的空格 UNIX操作系统 第八章Shell编程 73 流程控制 例 str1 test str1 echo 1要用引号把变量括起来 test str1 echo 0 test n str1test argumentexpected test n str1 echo 0 UNIX操作系统 第八章Shell编程 74 流程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论