Linux基础教程(清华课件)-第9章 shell编程.ppt_第1页
Linux基础教程(清华课件)-第9章 shell编程.ppt_第2页
Linux基础教程(清华课件)-第9章 shell编程.ppt_第3页
Linux基础教程(清华课件)-第9章 shell编程.ppt_第4页
Linux基础教程(清华课件)-第9章 shell编程.ppt_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

Linux基础教程 1 操作系统基础 清华大学计算机基础教育课程系列教材汤荷美董渊李莉程志锐编著 总目录 第1部分Linux操作系统第1章操作系统概述第2章处理机管理第3章存储管理第4章调度第5章设备第6章文件系统 第2部分操作系统命令及shell编程第7章Linux基本命令第8章使用vi编辑文件第9章shell编程第3部分系统管理第10章Linux系统软件的获取和安装第11章账号管理第12章文件系统管理第13章TCP IP网络管理第14章备份与恢复第15章XWindow及Genie应用程序 第9章shell编程 9 1shell概述9 2shell的基本功能9 3shell启动及其命令9 4shell命令的集成9 5shell变量9 6shell的控制结构9 7shell的运行环境9 8shell应用实例9 9小结习题 shell是一种命令语言 同时又是一种程序设计语言 shell的语言处理能力 使得用户能够方便地定义各种变量 参数 并使用各种控制语句编写复杂的命令程序完成多种工作 本章介绍shell shell程序设计语言 shell的运行环境及shell程序的调试 9 1shell概述9 1 1什么是shellshell是一种命令解释程序 命令解释器 shell解释用户输入的命令行 提交系统内核处理 并将结果返回给用户 与Linux命令一样都是实用程序 但两者又有区别 一旦用户注册到系统后 shell就被系统装入内存 并一直运行到用户退出系统之止 而一般命令仅当被调用时 才由系统装入内存执行 shell本身也是一种可编程的程序设计语言 用shell写的程序 shell脚本 相当于dos windows下的批处理文件 它可以简单到只有一条命令 也可以复杂到包括大量循环 条件语句 数学运算 控制结构 也可以是介于两者之间的程序 9 1 2shell程序语言的特点shell允许通过编程来完成复杂的功能处理 但其作为语言与高级语言相比较具有不同的特点 1 shell是解释性的 多数高级语言是编译性的 2 shell语言与高级语言处理的对象不同 3 shell与系统有密切的关系 4 shell易编写 调试 灵活性较强 但速度低 5 shell作为命令级语言 命令组合功能很强 9 1 3shell的版本shell有两种主要语法类型 Bourneshell和Cshell 彼此不兼容 Bourneshell家族 shkshbashpshzsh Cshell家族 cshtcsh 其中bash和zsh在不同程度上支持csh的语法 这里 我们再着重介绍一下bash的特点 1 自动补全功能假设要输入的命令很长 或者命令后面要给的文件名很长 这个时候只要按一个Tab键 bash就会在可能的命令或文件名里面找寻匹配的命令 找到的话就会自动帮你补齐 2 命令行编辑程序bash的命令行编辑是在提示符下 可对未执行的命令字符任意地修改 3 命令历史 commandhistory 所谓的命令历史就是把曾经输入过的命令记录起来 方便日后的查询与使用 只要按向上键就可以调出前一个命令 再按一次向上键就可以调出更前一个命令 依此类推 用向下键可以回到下个命令 所以用上 下键就可以选择以前输入过的命令 9 2shell的基本功能9 2 1程序的运行当用户输入一行命令后 shell负责解释 分析输入的内容 并且决定做什么 同时替系统内核删除命令行中不必要的信息 命令是一个可执行的Linux命令 程序 工具或shell脚本 例1 ls lfile1file2file3例2 echo WelcometoTsinghuaUniversity 例3 echoWelcometoTsinghuaUniversity 注意 例2和例3的结果是完全一样的 9 2 2使用保留字和元字符shell有一些具有特殊意义的字 保留字 如在shell脚本中 像do done for while等保留字控制循环操作 if then else等保留字进行条件控制 保留字随shell的不同而不同 在Linux系统里 有一组特殊意义字符 这就是所谓的元字符 通配符 现在列出一些常用的通配符的意义 供参考 上一层目录 与cd命令配合用得比较多 目前工作的目录 任意长度的字符 长度为一个的任意字符 括号内的一个字符 m等于某个通配符 如 等 a z 小写字母开头的所有字符串 转义符号 用以解除特殊字符的特殊意义 用户目录 分隔符 当命令行有多个命令时 做分隔用 BourneShell的提示符 同时也作为shell语言的位置变量参数 做注释用 建立一个管道 使一命令的输出作为另一个命令的输入 将命令以后台方式执行 将命令的输出重导入文件中相反 将命令的输出加在一个已经存在的文件后面 括号内的一个字符串例 ls xt 显示当前目录下以t打头的所有文件 9 2 3变量 文件名的替换1 变量的替换shell允许对变量赋值 shell一旦在命令行中发现 变量名时 将在 变量名的位置上用以前赋给该变量的值替代 变量名 例 myhome usr app1 echo myhome usr app1 ls x myhomefile1file2file3file4 2 文件名的替换shell在命令行中将文件名进行替换 事实上 shell在确定要执行的程序名和它的自变量之前 要对命令行扫描 找出元字符进行相应的文件名的替换 例 ls xfile1file2file3file4 echo file1file2file3file4 9 2 4输入输出重定向 改向 shell处理命令行的输入输出重定向 它扫描命令行中特殊改向字符 msg catmsgPleasecallme 62781849注意 就程序或命令本身而言 它并不知道其标准输出已被改向 只是简单地按照自身的方式向标准输出输送信息 正如shell扫描命令行查找重定向字符一样 它也查找管道字符 对于所发现的每个管道字符 它将管道字符前面的命令的标准输出连接到管道字符后面的命令的标准输入中 然后启动两个程序的执行 例 w wc l 假设有8个用户上机 8 9 2 5运行环境的控制当用户登录到Linux系统中 系统启动一个交互式的shell命令解释器 称为注册shell 该shell为此用户创建工作环境 shell提供了一定的命令 允许用户对自己运行的环境进行控制 即对运行环境实现客户化 用户的运行环境包括 主目录 终端类型 输入命令提示符 查找命令的路径名 以及其他全局变量等 例如 BourneagainShell BourneShell KornShell和CShell的环境文件分别为 bash profile profile kshrc和 cshrc 9 2 6支持shell的编程shell除了具有命令解释器的功能外 它本身就是一种程序设计语言 这种语言也由shell解释执行的 用户可以在文件中编写一组shell命令 该文件称为shell脚本或shell程序 通过把命令 变量赋值及条件控制语句结合起来 用户就获得了一个强大的编程工具 需要说明的是 在Linux系统本身就存在大量的shell程序 用于各种管理和应用 9 3shell启动及其命令9 3 1shell的启动1 系统在用户登录时启动shell在Linux系统引导过程中 首先启动init进程以查询终端的各个端口及其特性 当发现活动的终端时 调用getty进程 接着getty进程在接受用户名和口令后 调用login进程 login进程负责验证用户身份 验证后把控制权交给shell程序 shell根据环境文件建立系统范围内的工作环境和该用户自己的工作环境 最后显示命令提示符 在 etc passwd文件中指定要启动的shell 如下所示 root x 0 0 root root bin bashjohn x 201 Certer starf home bin sh2 命令行状态下的交互shell启动在系统中可能有多种版本的shell存在 可通过相应的命令来启动 如 bsh ksh sh3 执行用户命令时启动shell 子shell 由系统生成新的子shell来执行该命令 9 3 2命令的查询环境变量PATH的构成决定了寻找shell命令和其他程序的途径 是影响shell程序效率的主要因素之一 PATH变量设置要考虑以下几点 在PATH变量中 命令使用得多的程序目录应放在前面 极少用目录不设在PATH变量中 在shell程序内用得较多的程序目录应加在变量PATH中 并且PATH应尽可能地短 不要出现重复的目录 还要尽量避免查询大目录 如需设置 将其路径放在PATH路径的最后位置 例 PATH bin usr bin etc 9 3 3shell常用的命令Linux系统通常提供了许多命令以方便用户与系统的交互对话 这些命令的选项较多 并且可利用命令的集成 如输入输出改道 管道机制 及程序设计功能组合成许多命令 Linux有丰富的shell命令 大致划分为以下几类 目录操作与管理 文件操作与管理命令 系统管理与维护 用户管理与维护 系统状态 进程管理 通讯命令 其他命令 例如 awkcatchmodchowncpcrondatedfdiffduechoexprfilefindgrepinitkilllnloginlsmailmakemanmkdirmvnohuppgpspwdreadrmwc 通常情况下 在用户输入一个命令 非内部命令 时 注册shell首先通过查询路径查找该命令 然后生成出一个副本 称为该shell的子shell 由子shell来负责解释执行这个命令 在命令执行过程中 注册shell 父shell 等待子shell的执行而进入睡眠态 一旦子shell执行完毕 子shell将唤醒注册shell 父shell 而自己的生命周期到此结束 9 3 4shell的内部命令内部命令构造在shell的内部 内部命令比非内部命令的执行速度要快 因此 编写shell程序时应尽量地使用shell的内部命令 shell常用的内部命令有 注释命令 后面的内容作为注释信息 空命令 通常放在一行的最左边 实际不做任何命令 只返回出口代码0 其他命令有 cd eval set unset exec exit if else for case while until continue break等 9 4shell命令的集成9 4 1元字符和文件名生成1 UNIX元字符 通配符 的定义 匹配任何字符串 包括空字符串 匹配任何单个字符 按照范围 列表或不匹配等形式匹配指定的字符 转意符 使元字符失去其特殊的含义 例 a d x y 匹配字符a b c d x y z 匹配以字符z开始的任何字符串 x y匹配以x开始 以y结束 中间为任何单个字符的字符串 Z 匹配不为Z的单个字符 2 元字符作为文件扩展名的使用例 a f 匹配字符a到字符f开头的文件名 如abc d2 e3 c f dat z匹配以字符z结尾的任何字符串 如win z core zz a c 5z rc d匹配以rc开始 以 d结束 中间为任何单个字符的文件名 如rc0 d rc2 d rcS d o 匹配不以o结尾的文件名 9 4 2管道和命令表在shell中有两种结构类型 管道线和命令表 当shell检测到一个管道操作符时 就建立一个系统管道文件 这是一个先进先出的数据结构 它允许在同一时刻对管道线上的命令或程序进行读和写 即允许两个无关的命令通过管道连接交换信息 1 管道的概念管道 是一个命令的标准输出与另一个命令的标准输入之间的连接 不经过任何中间文件 管道线 是由管道操作符分隔的一个命令序列 最简单的管道线是一个简单命令 管道操作符 用符号 表示 例 w wc lpsaux grepftp2 命令表的概念命令表 一串管道线构成了一个命令表 最简单的命令表是一个管道线 一个命令表送回的值是该命令表中最后一个管道线的出口状态 管道线分隔符 分隔命令表元素 确定管道线执行的条件 各分隔符含义如下 表示按顺序执行管道线 表示根据条件 true 执行其后面的管道线 表示根据条件 false 执行其后面的管道线 表示前面的管道线在后台 异步 执行 例1 四个管道线构成一个命令表ls l tmp rootw wc lps例2 与例1等价ls l tmp root w wc l ps例3 sys account 9 4 3命令组合命令组合有两种形式 命令表 和 命令表 前者只在本shell中执行 不产生新的子进程 后者要产生新的子进程来执行命令表 例1 cdmydoc rmjunk 该命令表只能在当前shell下执行 先进入目录mydoc 然后执行rm命令 执行完毕后 当前目录已改变为mydoc 例2 cdmydoc rmjunk 当前shell要生成一个子shell进程 由该子shell来执行命令表 子shell完成操作后 自然消亡 而其父shell进程的当前路径并没有变化 9 4 4命令替换当一个字符串被括在反撇号 中时 该字符串将作为命令被shell解释执行 即用命令的执行结果替换这个字符串本身 要注意反撇号与单引号的区别 例1 now date echo nowdate now date echo now1998年10月28日星期三17时51分56秒CST例2 count 10 count expr count 1 echo count11 9 4 5输入 输出重定向1 使用标准改向符进行重定向 改向 输出改向 追加输出改向2 使用标准文件描述字进行重定向 改向 在Linux系统中 定义了用于输入 输出的标准文件 其文件描述字0为进程的标准输入 文件描述字1为标准输出 文件描述字2为标准错误输出 3 标准错误输出的改向 格式为 command2 filecommand2 file例1 将myfile1作为sort的输入 sortmyfile2例3 将ls l的输出追加到myfile3文件中 ls l myfile3例4 将错误输出改向到err file文件 myprog2 err file例5 将标准输出和错误输出改向out文件 myprog out2 out myprog out2 1 9 5shell变量9 5 1shell变量描述shell实际上是基于字符串的程序设计语言 但也有变量 shell变量能够而且只能存储正文字符串 即它只有一种类型的变量即串变量 但从赋值的形式上看 则可以分成四种类型的变量或变量形式 变量的名字必须以字母或下划线开头 可以包括字母 数字和下划线 9 5 2用户自定义变量用户自定义变量语法格式 name string 赋值号 两边不允许有空白符 例 nodehost beijing UUCPpath bin usr bin etc bincount 10允许多个赋值操作 按从右到左的顺序进行 例 A BB abcC OK echo A B CabcabcOK当引用一个未设置的变量时 其隐含值为空 例 echo mailispathofmailbox ispathofmailbox 如果用双引号 将值括起来 则括起来的字符串允许出现空格 制表符和换行符等特殊字符 而且允许有变量替换 例1 MAIL var mail fk var MAILispathofmailbox echo var var mail fkispathofmailbox例2 str Thisis nabook echo strThisisabook 如果用单引号 将值括起来 则括起来的字符串允许出现空格 制表符和换行符的特殊字符 但不允许有变量替换 例3 BOOK Englishbook MSG BOOK echo MSG BOOK例4 msg TodayisSunday echo msgTodayisSunday 引用变量的值时 可以用花括号 将变量名称括起来 使变量名称与它的后续字符分隔开 如果紧跟在变量名称后面的字符是字母 数字或下划线时 必须要使用花括号 例5 str Thisisastring echo str enttestofvariables Thisisastringenttestofvariables echo strenttestofvariables testofvariables 可将变量设置为只读形式 格式为 readonly变量名1变量名2例6 ux UNIX SUN readonlyux ux UNIX SCOux isreadonly查看只读形式的变量 格式为readonly例7 readonlyreadonlyux 9 5 3位置变量位置变量顾名思义是与变量所在位置有关的变量 这是一种特殊的变量 当一个shell过程被调用时 shell隐含地为它建立一系列的位置变量 这种位置变量是系统预定义好的 可以直接引用 如命令行的shell过程名本身被指定为位置变量 0 第一个命令参数为 1 第九个命令参数为 9 例 ls bin etc usr bin dev 0 1 2 3 4 5 1 内部命令shift的作用当位置变量个数超出9时 就不能直接引用位置大于9的位置变量了 必须用shift命令存取 每执行一次shift命令 删除 1位置变量 并使其他的所有位置变量向左移动一个位置 例 0 1 2 3 4 5 6 7 8 9myprogabcdefghijshiftbcdefghijshiftcdefghijshiftdefghij 2 用set命令进行强制性赋值位置变量可以使用set命令进行强制性赋值 例 setSunMonTueWedThuFriSat结果 1 2 3 4 5 6 7注意 0是不能用这种方法赋值的 9 5 4环境变量shell执行环境由一系列环境变量组成 这些变量是由shell维护和管理的 所有这些变量都可被用户重新设置 变量名由大写字母或数字组成 CDPATH执行cd命令时使用的搜索路径 HOME用户的home目录 PATH寻找命令或可执行文件的搜索路径 PS1主命令提示符 默认为 PS2从命令提示符 默认为 TERM使用的终端类型 9 5 5预定义的特殊变量在shell中有一组特殊的变量 其变量名和变量值只有shell本身才可以设置 记录传递给shell的自变量个数 例1 myprogabc则 的值为3例2 iftest lt2thenecho twoormoreargsrequired exitfi 取最近一次命令执行后的退出状态 执行成功返回码为0 执行失败返回码为1 例 test rmy file 假设my file文件不可读 echo 1 记录当前shell的进程号 9 5 6变量替换shell在遇到未设置的变量时 将其值作为空串处理 而在实际应用中 对于未设置的变量 用户可以根据需要采用不同的处理方式 这可通过变量替换来实现 变量替换提供了三种功能 允许替换未设置变量的隐含值 允许对未设置变量赋值 在访问未设置变量时 提示出错信息 格式为 var word 例1 假设 PARM未设置 echo ThevalueofPARMis PARM undefined ThevalueofPARMisundefined echo PARM 例2 假设 PARM未设置 arg PARM notdefined 注意 双引号 echo arg arg arg notdefined例3 对未设置变量赋值 catuse dsel 1 sel main 注意 此处的 为空命令 echo Yourselectionis sel use dprogrammingYourselectionisprogramming 注意 变量替换的这种形式不允许使用位置变量 若要使用位置变量 则必须先将位置变量赋值给一中间变量 然后再对中间变量进行这种形式的替换 例4 将例3中的空命令用中间变量替换 catuse dsel 1my sel sel main echo Yourselectionis my sel use dprogrammingYourselectionisprogramming 例5 测试环境变量TERM是否设置 catcheck env TERM theTERMvaribleshouldbeset 注意 出错信息以一行长为限 且输出到标准错误输出上 9 5 7特殊字符的引用在shell中所使用的许多特殊符号也可为其他目的所使用 因此当不需要引用这些字符的特殊含义时 就必须进行删除 消除特殊字符的含义有3种常用的方法 分别是转义符 单引号和双引号 1 转义符 的引用使用转义符消除单个字符的特殊含义 即将紧跟在转义符后面的单个字符按字符本身的实际含义解释 例 转义符具有续行功能 catback shecho Enteryourname c readnameechoHello name back shEnteryourname johnHellojohn2 单引号 的引用使用单引号消除被括在单引号中的所有特殊字符的含义 即单引号表示内容照原样不动 例1 echo typea please typea please例2 在指定的目录中 查找名字为 zh或 sh文件 cattest shgrep zh sh 1 3 双引号 的引用使用双引号能消除被括在双引号中的大部分特殊字符的含义 不能消除的字符有 例1 echo Typea please Typea please例2 vdate date isthesystemmaintenancetime 例3 catshare filemkdir tmp fkchmod755 tmp fkcp tmp fkchmod777 tmp fk 4 特殊字符串引用的例外引用双引号 单引号和转意符都不能消除对echo命令有特殊功能的控制字串的特殊含义 这些控制字串是 b退格 c显示后不换行 f在终端上屏幕的开始处显示 n换行 r回车 t制表符 v垂直制表符 反斜杠 9 6shell的控制结构9 6 1条件与test命令在程序设计语言中 作出决策的结构称为条件 在高级语言中决策的作出是依赖于基本运算的结果 在shell语言中 作出决策所依赖的条件是所执行命令的 出口状态 当shell命令或程序执行成功时 它返回一个 零 出口状态 即 为零 如果执行的命令或程序出错时 则返回一个 非零 的出口状态 即 不为零 除了一般命令的出口状态外 UNIX还提供了两个命令true和false的出口状态 true的出口状态为零 而false的出口状态为非零 shell将true和false命令作为恒真和恒假条件使用 例 判断所给出的参数是否为一个目录 catcheck dirtest d 1 echo 1isadictory exit0echo 1isnotadictroy exit1在上例中 使用了exit命令 它是一个shell的内部命令 用于终止shell程序的执行 该命令可带一个定义出口状态值的自变量 例 exit 0 终止程序的执行 并返回零值 exit 1 或exit x 终止程序的执行 并返回非零值 将命令返回零出口状态称为返回 真值 将命令返回非零出口状态称为返回 假值 1 test命令test命令是shell程序设计的条件判断中最常用的测试命令 它有两种等价的格式 testexpression或 expression 注意 中的空格 其中expression就是要测试的条件 如果test计算expression的结果为真 则返回 零 出口状态 否则返回 非零 出口状态 test命令可用于对字符串 整数及文件进行各类测试 2 test字符串测试表达式例1 两个字符串进行比较 user smith test user smith echo 0 test user tom echo 1 例2 带有空格的字符串比较 month January test month January echo 1 test month January echo 0注意 shell在处理变量时 遇到有双引号将保留其内容 而省略双引号时 将滤去空格 例3 带有空格的字符串比较 a testingstring test a testingstring echo 0 test a testingstring test unknownoperatorstringshell处理变量 a时 将其进行变量替换 然后将结果 testingstring 传递给test 而test将string作为操作符来处理 因此出错 例4 带有空串 或未设置的字符串比较 name test name smith echo 1 test name smithtest argumentexpectedshell处理变量 name时 双引号将其括起的内容作为一个 位置持有者 来保留 并把该值传递给test 保证处理的正常执行 例5 带有空串的字符串比较 blanks test blanks echo 1 test blanks echo 0shell处理变量 blanks时 将空格滤去 使其变为空串传递给test 而双引号保留 位置持有者 的位置 其值为一个空格 空白符 传递给test 例6 带有算符的字符串比较 symvar echo symvar test z symvar test argumentexpected出错的原因是 运算符比 z 运算符的优先级要高 因此 test命令期望在等号之后要有一个自变量 为避免上述问题发生 可用下面命令形式替换 testx symvar x echo 1 3 使用test测试字符串时要注意的问题 1 向test传递的各自变量之间必须有空白字符 如果 与任一自变量之间没有空白字符就会产生错误 2 在使用变量的值替换的自变量上 用双引号括起来十分必要 以保证test在变量的值为空时也能接收到该自变量 这是一种良好的shell程序设计风格 3 在test命令的测试中 空格和引号是shell程序设计中经常发生错误的焦点 要特别引起注意 4 test命令对它的自变量非常讲究 在比较的串中出现运算符时 要考虑到运算符优先级的问题 4 test命令可用于整数比较首先要搞清楚整数比较的两个概念 shell并不区分放在shell变量中的值的类型 就变量本身而言 它存放的仅仅是一组字符串 即shell只有一种类型的变量 串变量 当使用整数比较操作符时 是test命令来解释存放在变量中的整数值 而不是shell 命令格式为 test整数测试表达式 例1 x1 005 x2 10 test x1 5 echo 1例2 test x1 eq5 echo 0例3 test x2 eq10 echo 0 5 test用于文件的测试test可用于文件各种特性的检查 这些文件的操作符自然是一原操作符 意味着它们要求其后跟随一个自变量 在所有的情况中 这个自变量是一个文件或目录名 常用的文件测试表达式示例如下 例1 检查指定的文件是否存在并且可读test f usr fk message例2 检查指定的文件是否为目录test d usr src local sendmail例3 检查指定的出错文件是否为空 如不空则列出该文件的内容test s errfile echo Errorsfound cat errfile 6 表达式的逻辑运算在实际应用中常需要将多个表达式用逻辑运算符组合起来 构成比较复杂的条件 逻辑运算符包括 逻辑非单目运算符 可放置在任何其他test表达式之前 求得表达式运算结果的非值 a 逻辑与运算符 执行两个表达式的逻辑与运算 并且仅当两者都为真时 才返回真值 o 逻辑或运算符 执行两个表达式的逻辑或运算 并只要当两者之一为真时 就返回真值 逻辑运算符优先级 由高到低 的排列顺序如下 a o 逻辑运算符优先级要比字符串操作符 数字比较操作符 文件操作符的优先级低 例1 当指定的文件不可读时为真 test r usr fk message例2 当指定的文件均存在 且message为可读 mailfile指定的文件为普通文件时 返回真 test r usr fk message a f mailfile 例3 当变量值大于等于0并且小于10时为真 test count ge0 a count lt10例4 当变量 a等于0或者 b大于5 并且 c小于等于8时为真 test a eq0 o b gt5 a c le8 9 6 2if结构1 if的简单结构格式为 ifcommandthencommandcommand fi 2 if的完整结构格式为 ifcommandthencommandcommand elsecommandcommand fi 3 if的连用结构格式1ifcommandthencommandselseifcommandthencommandselse ifcommandthencommandsfi fifi 格式2ifcommandthencommandselifcommandthencommandselif elifcommandsthencommandselsecommandsfi 9 6 3case结构格式为 casevalueinpattern1 command command pattern2 command command patternn command command esac 9 6 4for结构格式为 forvariableinarg1arg2 argndocommand commanddone 9 6 5while结构格式为 whilecommanddocommand commanddone 9 6 6until结构格式为 untilcommanddocommand commanddone 9 6 7循环体中其他命令1 break命令格式为 break或breaknbreak是shell的内部命令 用于在循环体中根据命令运行的返回条件 直接终止循环体内命令的执行 当执行break命令时 控制流从循环体中转移到done之后的第一条命令上 当执行breakn命令时 则终止最内层的n个循环的执行 2 continue命令格式为 continue或continuen continue是shell的内部命令 用于在循环体中根据命令运行的返回条件 直接进入下一次循环命令的执行 当执行continue命令时 控制流直接转到本循环体中第一条命令上 当执行continuen命令时 则跳过最里层的n次循环体的执行 即开始第n个 从内向外数 循环的下一个循环过程 3 循环中的输入输出改向对整个循环命令也可实施shell命令的输入输出改向 循环输入的改向将作用于循环体中从标准输入读数据的所有命令 而循环输出改向将作用于循环体中向标准输出写数据的所有命令 在循环体内也可以进行输入输出改向 且这种改向独立于整个循环体命令的输入输出改向 例 whiletest count lt20do echo error count echo right count dev tty done2 error out 4 循环体与管道循环命令也能通过管道与其他的shell命令联接在一起使用 一个命令的输出通过管道可以作为循环命令的输入 而整个循环命令的输出也可以通过管道作为另一个命令的输入 例 foriinabcd do echo i done wc l4 9 6 8函数的定义和使用函数实际上是由若干shell命令组成 因此它与shell的命令文件形式上是相似的 不同的只是shell函数常驻于内存之中 它们不再是一个单独的进程 而是成了shell的一部分 格式为 FunctionName command command 函数仅存在于定义它的shell环境中 不能把它们传递给子shell 函数是在当前shell中被执行的 在函数体中变量值和当前工作目录的改变 将影响当前shell的运行环境 函数一旦定义就被存入内存 shell执行函数时不需要在磁盘中进行查找 所以执行速度要比把函数中的命令放入到一个文件中的执行要快 使用函数时 命令行中列在函数名后的自变量传递给函数体中的位置参数 函数执行返回时也有一个出口状态 函数体内执行exit命令将结束函数的执行 同时也结束调用函数的shell程序的运行 而return命令用于结束函数的执行 如省略return时 则以最后一条命令的出口状态作为函数的出口状态 例 ThetestcodesforfunctiondefinitionGetYesOrNo whileecho Y N c esacdone执行 GetYesOrNo Doyouwishtocontinue exit显示Doyouwishtocontinue Y N 9 7shell的运行环境9 7 1局部变量当用户注册之后 用户就拥有了注册shell的运行环境 其运行环境主要由shell变量值决定 注册shell在接受到用户输入的命令 非内部命令 后 通常派生出一个子shell 由此子shell负责解释执行该命令 子shell有自己的运行环境和局部变量 局部变量仅在特定的环境下才能使用 shell的运行环境是可以改变的 但子shell不能存取由父shell设置的局部变量 也不能改变父shell的变量值 例1 catvar testecho x x 100 var test 例2 catvar test2x 60echo x x 10 var test2 60 echo x10 9 7 2全局变量全局变量是一种特殊的变量 可以被任何运行的子shell来引用 全局变量通过export命令来定义 格式如下 exportvariables其中variables是定义全局变量的变量表名 一旦变量被定义为全局变量 则对于以后的所有子shell来说这些都是全局变量 子shell中无法改变全局变量的值 若在子shell中改变全局变量的值 实际是对全局变量的副本进行更改 不影响全局变量值 子shell中局部变量的使用优先于全局变量 例 exportg var g var GLOBAL cattest varexportg varl varg var sub shell g var l var sub shell l var echo g var l var test varsub shell g varsub shell l var echo g var l var GLOBAL 9 7 3局部变量和全局变量作用域任何没有用export命令定义过的变量是局部变量 子shell不能存取父shell的局部变量 子shell中可以存取和修改父shell的全局变量 但这种修改对于父shell全局变量没有任何影响 在子shell中用export命令定义的全局变量和对此变量的修改对父shell变量没有影响 全局变量保持它的全局性 不仅能直接传递给它的子shell 而且子shell还能将它传递给子shell的子shell 在对变量赋值之前和之后的任何时候可以将该变量转换成全局变量 9 7 4程序调试shell提供了多种工具以便在调试shell程序时使用 这些工具允许观察一个shell程序的执行 还允许观察一个程序在不做任何实际处理的情况下是如何被 执行 的 提供的测试方式有 1 shell程序的详细跟踪shell提供的详细跟踪特性允许用户观察一个shell程序的读入和执行 如果在读入命令行时发现语法错误 则终止程序的执行 命令行被读入后 shell按读入时的形式在标准错误输出中显示该命令行 然后执行命令行 详细跟踪shell程序的执行有两种方式 整个程序的详细跟踪和局部程序的详细跟踪 整个程序的跟踪执行格式 sh v文件名用来实现对整个文件的脚本进行跟踪 局部程序的跟踪执行格式 set v 设置跟踪标志set v 关闭跟踪标志用来实现对文件中的部分脚本进行跟踪 例 cattraceddateecho PATH wc c traced1998年11月05日星期四17时29分59秒CST45 sh vtraceddate1998年11月05日星期四17时30分08秒CSTecho PATH wc c45 2 shell程序的跟踪执行此功能允许用户观察一个shell程序的执行 它使命令行在执行前完成所有替换之后 在标准错误输出中显示每一个被替换后的命令行 并且在行前加上前缀符号 但变量赋值语句不加 符号 然后执行命令 对shell程序的跟踪执行也有两种方式 整个程序的跟踪执行和局部程序的跟踪执行 整个程序的跟踪执行格式为 sh x文件名用来实现对整个文件脚本的跟踪执行 局部程序的跟踪执行格式为 set x 设置跟踪标志set x 关闭跟踪标志 用来实现对文件中部分脚本的跟踪执行 例 cattraceddateecho PATH wc c sh xtraced date1998年11月05日星期四17时30分08秒CST echo bin usr bin usr fk bin bin usr bin usr fk bin wc c25 3 详细跟踪与跟踪执行的组合整个程序的跟踪执行格式为 sh vx文件名局部程序的跟踪执行格式为 set vx 设置跟踪标志set vx 关闭跟踪标志详细跟踪与跟踪执行的区别在于在执行命令行之前 详细跟踪打印出命令行的原始内容 而跟踪执行却打印出经过替换后的命令行内容 循环结构和管道线在两种跟踪方式中是根本不同的 由于shell对这些结构只读取一次 因此 详细跟踪方式也仅显示它们一次 但这类结构的命令行可能要被重复执行多次 所以 跟踪执行方式就可能将同样的命令行显示一次以上 4 非执行跟踪shell的非执行任选项提供的功能允许用户观察一个shell程序 而程序中的命令行不被执行 非执行通常与详细跟踪结合使用 查看在不实际执行一个shell程序时 程序是如何被 执行 的 其格式为 sh n文件名或set n 5 未置变量退出跟踪shell的未置变量退出特性允许对所有的变量进行检查 如果引用了一个未赋值的变量就终止shell程序执行 shell通常允许未置变量的使用 在此种情况下 变量的值为空 但如果设置了未置变量退出的任选项 则一旦使用了未置的变量就显示出错信息 并终止程序的运行 其格式为 sh u文件名或set u 设置标志set u 清除标志 6 立即退出跟踪shell的立即退出特性允许在程序内的任何命令以非零状态退出时 立即终止程序的运行 其格式为 sh e文件名或set e 设置标志set e 清除标志 9 7 5shell程序的应用1 shell程序的定义若一个文件包含了一串简单命令串时 称为命令文件 若一个文件包含了一组更为复杂的命令组合 常常使用了shell的条件命令 控制结构和其他高级特性 时 就称之为shell程序 或称shell过程 通常情况下 两者的称呼并没有明确的区别 在shell程序设计语言里的基本操作是Linux系统命令 它是Linux系统中最有生气的部分 而且对于Linux系统的使用极为重要 2 何时使用shell程序设计语言当一个问题的解决方法需要使用多个Linux系统的标准命令时 可使用shell命令文件 如果处理的问题比较复杂 可以使用shell程序设计语言 即在命令文件中定义各种参数和变量 使用shell的条件命令 控制结构和其他高级特性 9 8shell应用实例下面这段程序取自 etc rc d rc sysinit文件中的一部分 etc rc d rc sysinit文件是Linux系统启动过程中需要执行的shell程序 这段程序的功能主要是配置网络环境 检查文件系统和加载应用模块 要注意 在shell程序中注释语句是以 开头 但以 开头的语句并不是注释语句 如果想执行该程序 可以用一般用户登录系统后 直接执行 etc rc d rc sysinit 第一条语句先指定本shell程序采用哪个shell执行 bin sh 以 开始的语句是注释行 etc rc d rc sysinit runonceatboottime TakeninpartfromMiquelvanSmoorenburg sbcheckrc 下面语句是定义变量PATH 并把PATH变量声明为全局变量 SetthepathPATH bin sbin usr bin usr sbinexportPATH 下面命令读取配置数据 这里用到一个简单的IF语句 判断 etc sysconfig network文件存在否 如果该文件存在 就执行它 否则 给NETWORKING变量赋值 给HOSTNAME变量赋值 Readinconfigdata if f etc sysconfig network then etc sysconfig networkelseNETWORKING noHOSTNAME localhostfi 下面语句的功能是启用交换 执行shell命令swapon Startupswapping echo Activatingswappartitions swapon a 以下语句设置主机名 下面语句引用hostname变量 执行hostname命令 Setthehostname hostname HOSTNAME echohostname hostname 下面语句设置NIS域名 其中引用 NISDOMAIN变量 执行shell命令domainname SettheNISdomainnameif n NISDOMAIN thendomainname NISDOMAINelsedomainname fi 下面是一段简单的if语句 判断 fsckoptions文件是否存在 并定义fsckoptions变量 if f fsckoptions thenfsckoptions cat fsckoptions elsefsckoptions fi 下面是一段简单的if语句 判断 fastboot文件是否不存在 其中 引用fsckoptions变量 执行shell语句fsck 并引用系统变量 定义变量rc 获取上一个shell语句的执行结果 if f fastboot thenecho Checkingrootfilesystems fsck V a fsckoptions rc 以下这段语句是检查文件系统的执行结果 如果 rc大于1 说明文件系统有严重问题 并显示信息 其中 给环境变量PS1赋值 执行shell命令sulogin 执行shell命令umounta 执行shell命令reboot Areturnof2orhighermeanstherewereseriousproblems if rc gt1 thenechoechoecho Anerroroccurredduringthefilesystemcheck echo Droppingyoutoashell thesystemwillreboot echo whenyouleavetheshell PS1 Repairfilesystem exportPS1suloginecho Unmountingfil

温馨提示

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

评论

0/150

提交评论