shell编程介绍.pdf





《shell编程介绍.pdf》由会员分享,可在线阅读,更多相关《shell编程介绍.pdf(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载本部分以两章介绍s h e l l编程:第1 6章介绍s h e l l编程基本的概念和Solaris 2.x系统软件中可用的三种s h e l l。描述了s h e l l的运行、编程要素,并提供对照 s h e l l文法的参照表。第 1 7章包含s h e l l脚本的例子。对s h e l l程序的了解有助于解释系统脚本,如运行控制脚本(r c),并编写自己的脚本自动进行系统管理任务。如果需要熟悉 s h e l l编程基本原理以及决定使用何种 s h e l l执行特定的任务,请参阅这两章。本书不对使用 B o u r n e、K o r n、C s h e l l编程语言编程作
2、深入探讨,关于使用任何一种s h e l l编程语言方面的详细介绍,请参阅相关的各种书籍。第16章 编写shell脚本Solaris 2.x系统软件包括三种s h e l l:Bourne shell、Korn shell和C shell。它们都有支持执行串行命令、选择操作、进行逻辑测试和重复执行程序操作的高层编程能力。Bourne shell和K shell使用几乎相同的文法,只是 Korn shell为Bourne shell的扩充,并提供了更多的功能。Solaris 2.x系统软件使用Bourne shell编写的脚本来安装软件。C shell使用一种与C语言相似的文法,并提供Bourn
3、e shell没有的功能,如历史记录和数组功能。在这一章中我们将介绍 s h e l l编程的基本概念和三种 s h e l l,介绍s h e l l是如何工作的,并比较三种s h e l l的文法。在这一章所参考的表都将出现在第 1 7章中。16.1 基本概念s h e l l是Solaris 2.x的一种工具,它提供了用户和操作系统内核(K e r n e l)之间的一个接口。内核(K e r n e l)是操作系统的核心部分并控制计算机运行的基本状态。内核协调所有的执行程序并管理系统的资源。S h e l l就是一些特殊命令的解释器以请求和影响内核为用户提供执行实用程序的方法。每次用户
4、登录到系统或打开一个新的命令工具或 s h e l l工具窗口时,用户会被指定一个默认的s h e l l。s h e l l会解释它所读到的命令。可以在提示行中直接键入命令到 s h e l l,或者shell 从一文件中读取命令。一个包含s h e l l命令的文件叫 shell 程序 或shell 脚本。s h e l l程序是解释执行,不是编译执行:一个接一个依次地读和执行这些命令。而编译的程序,则开始就读入并转换成一种可以直接被 C P U执行的形式,然后一次执行完毕。因为s h e l l脚本是解释性的,所以最快的 s h e l l脚本运行起来也比等效的用一种经过编译的语言比如像
5、C写出的程序慢得多。16.1.1 介绍Bourne、Korn和C shellB o u r n e、K o r n和C shell有其自己的环境和文法。表格 1 6-1比较了在起动时定义 s h e l l环境第六部分shell编程介绍的初始化文件。表16-1 shell的初始化文件特征B o u r n eK o r nC登录时读取.p r o f i l e.p r o f i l e.l o g i n开启s h e l l时读取N/A在.p r o f i l e中被声明为E N V=.f i l e的文件.c s h r c初始化文件包含环境变量和其他的设置,以在 s h e l l
6、开始使用的时侯配置用户的环境。更多的信息请参阅“环境变量”部分。.p r o f i l e(B o u r n e和Korn shell)和.login(C shell)文件在用户登录到系统时执行。K o r n s h e l l和.cshrc(C shell)的环境文件在每一新的s h e l l开始时执行。使用这些环境文件去定义用于交互使用的别名和函数,并可设置变量以供当前的 s h e l l使用。1.Bourne shellBourne shell,是Steve Bourne在AT&T Bell实验室时编写出来的,是最早的 UNIX shell。因为它的编程能力和它广泛的可用性,使
7、其成为 s h e l l编程的首选s h e l l,它缺乏一些用于交互使用的特征,如内置(b u i l t-i n)算术功能和记录早先命令的能力(历史记录)。Bourne shell是r o o t的默认登录 s h e l l。并作为默认用户登录 s h e l l,如果不在用户的口令文件中详细说明另外的s h e l l的话。系统提供的管理脚本使用的是 Bourne shell。B o u r n e s h e l l的启动命令是/b i n/s h。Bourne shell的默认提示符是美元符号($)。r o o t用户的提示符是英镑符号(#)。2.Korn shellKorn
8、shell是David Korn在AT&T Bell实验室时编写出来的,是为了和 Bourne shell兼容并提供可以和C shell相比的交互特征而设计的。Korn shell包含便利的编程特征如内置的整数算术、数组和字符串操作功能。Korn shell比C shell运行得更快,而且可以虚拟运行所有为Bourne shell编写的脚本。Korn shell的启动命令是/b i n/k s h。Korn shell的默认提示符是美元符号($)。r o o t用户的提示符是一英镑符号(#)。3.C shellC shell是Bill Joy在伯克利市的加利福尼亚大学时编写的,为了使用如别名和
9、命令历史记录等用于交互的特征而设计。它的编程特征和 C语言很相似。C shell的启动命令是/b i n/c s h。C shell的默认提示符是系统名称后跟一个百分比符号()。r o o t用户的提示符是系统名称跟一英镑符号(#)。16.1.2 了解shell如何执行命令各s h e l l创建子s h e l l和子进程解释和执行命令子s h e l l和子进程在原始的父 s h e l l中运行。例如,下面是一个Korn shell执行命令顺序的简单例子。1)将命令解析为由固定的元字符分隔的单元。元字符包括:空格(S p a c e)、制表符(Ta b)、新行(N e w l i n e
10、)、()I&。单元包括字、关键字、I/0 重定向符、分号等。2)检查各单元前面的部分,以确定它是否为 s h e l l关键字,如f u n c t i o n或i f声明或反斜线。当找到关键字时,s h e l l会运行这一组命令。3)搜索别名列表。206第六部分 shell编程介绍下载4)展开所有表达式。5)替换变量。6)替换命令。7)替换算术表达式。8)拆分那些由变量、命令和算术替换的结果得到的项,并再次分解成字。9)展开通配符。10)检查内置命令、函数和可执行的文件。11)设置I/O重定向。12)运行命令。Bourne shell用同样的方法解释命令,但是并不检查别名、符号或算术。C
11、shell用不同的顺序来解释命令。16.1.3 命名shell脚本根据一般Solaris 2.x文件的命名规则来为s h e l l脚本命名。脚本名称应该形象地描述它的特征使人容易记住。脚本名字应避免和 Solaris 2.x本身的程序同名,除非想要用自己的脚本替换这些实用程序。每个s h e l l都有自己内置的命令。也应避免用内置 s h e l l命令作为脚本的名字。如果文件的名称和s h e l l的内置命令相同,如a l i a s、b r e a k、c a s e、c d、c o n t i n u e、e c h o、e l s e、e x i t或h i s t o r y,
12、那么s h e l l把脚本解释成为一个内置命令,并会在想执行脚本的时候去执行那个内置命令。例如,在B o u r n e或Korn shell中,如果将一个脚本命名为“t e s t”,会遇到麻烦,因为 t e s t是B o u r n e和Korn shell的内置命令。参考第1 7章中的s h e l l文法部分和s h(1)、k s h(1)和c s h(1)参考页以得到内置命令完全列表。16.1.4 标识shells h e l l脚本第一行确定了它使用哪一个解释器。使用表格1 6-2中的信息来识别s h e l l脚本首行代码的意义。表16-2 脚本的第一行S h e l l文法
13、B o u r n e#!/b i n/s hK o r n#!/b i n/k s hC#!/bin/csh-f用-f(快速的)选项使用/b i n/c s h运行脚本但不引用.c s h r c文件。如果不详细说明 s h e l l脚本的首行,且它是一可执行的脚本,当前的 s h e l l解释器将解释这个脚本。在首行之后的脚本中,以#开头的行为备注行,它不是脚本的可执行部分。16.1.5 使脚本可执行在运行s h e l l脚本之前,通常需要改变它的权限。我们至少应该有读和执行的权限(c h m o d5 5 5)。当写和调试脚本时,为了可以编辑这个文件,应使对文件有写权限(chmod
14、 755)。当s h e l l脚本编写完成的时候,要为它设置相应的权限。如果脚本不是公共的或是个人的,要使第16章 编写shell脚本207下载用限制的权限。如果需要不是相同组中的很多用户使用一个脚本,脚本就应该有更宽松的权限。16.1.6 存储shell脚本当创建了一个s h e l l脚本,只能在这个脚本所处的目录中运行它或使用全路径名来运行它,除非在路径变量中去包含了脚本所在的目录。如果要写很多脚本,可以在的主目录中创建/b i n目录并使得搜索路径包含这个目录。用这种方法,可从系统的任何目录中使用这个脚本。如果所提供脚本要被很多人使用,请保证它是正确无误的,并要将它放在一个用户很容易
15、访问的目录中。16.1.7 编写shell脚本程序下面步骤讲述了如何编写s h e l l脚本程序:1)决定想要脚本去做什么,列出要完成的任务和所需命令的清单。2)使用编辑器把命令写进文件。将文件名命名为一个可以表示脚本功能的名称。3)在脚本的首行中加入s h e l l标识。4)在文件开头中包含注解描绘脚本的目的和注解各个不同部分的脚本。这些注解可以在调试脚本时提供帮助并可以解释一些不常使用的脚本。注解也可以帮助别人理解写的脚本。5)保存文件和退出编辑器。6)改变权限使文件至少有读和执行的权限。7)检查路径变量,确认脚本所在的目录是在搜索路径中的。8)键入脚本的名称。脚本将逐行地执行。9)如
16、果发生错误,请调试脚本。10)当脚本完成之后,请决定把命令放在哪个目录中(如,在主目录中、本地的 /b i n目录中,或放在一个可以被更大范围用户访问的目录)。16.2 变量变量代表了内存中的一个临时存储区域。变量保存着一个值。改变变量的值叫做为变量赋值。s h e l l编程用到两种变量:s h e l l变量和环境变量。通常,s h e l l变量用小写字母而环境变量用大写字母。16.2.1 shell变量s h e l l变量被s h e l l维护且只在s h e l l起作用。s h e l l变量永远是局部且不会从父进程传送给子进程。1.在命令行中显示变量使用不带参数的s e t命
17、令去显示当前s h e l l变量和环境变量。B o u r n e和Korn shell显示变量的格式如下所示:208第六部分 shell编程介绍下载C shell将把它的变量显示为如下的格式:2.设置和显示s h e l l变量在B o u r n e或Korn shell中创建变量时,将一个值赋给一个变量名就可以了。如果值包含空格或一些s h e l l要用特殊方式处理的字符,必须引用。参考“引用”部分以获得更多的信息。使用下列文法为变量赋值:在下列的B o u r n e或Korn shell例子中,变量t o d a y设置为命令d a t e的输出:第16章 编写shell脚本20
18、9下载在所有s h e l l中显示变量的值,都可以使用 echo$variable命令。尽管Korn shell可识别e c h o命令,但print$variable是首选的文法。可以将变量放入括号()中。可以使用括号把变量和跟在它后面的信息分开以保证变量的正确性。在下列的例子中,f l o w e r变量开始的值为r o s e。如果想在屏幕上显示出变量的内容后再加一个“s”,则这时必须使用括号。在前面的例子已经提到,可以在命令行中设置局部变量。同样地,也可以使用脚本设置变量。使用下列文法设置C shell的变量。如果变量的值中包含空格或需要特殊方法解释的字符,必须使用引用。请参考“引用
19、”部分以获得更多的信息。set variable=value也可以将变量的值设置为另一个命令的返回值。使用反引号()包含命令名来实现这个功能。Korn shell也支持$(command)的形式。下列C shell例子将变量t o d a y设置为d a t e命令的输出:参考“引用”部分以获得更多的信息。3.删除s h e l l变量设置可以使用u n s e t命令来删除任何s h e l l变量,就像如下所示的Bourne shell例子一样:4.剥除文件名有时需要修改路径名,剥除路径名(包括目录和文件名)中不需要的部分。在 Bourne shell中,可以使用b a s e n a m
20、 e(1)命令来返回文件名和 d i r n a m e(1)命令用来返回目录前缀。K o r n和Cs h e l l都提供了内置的方法来修改路径名。5.Korn shell中的路径剥除Korn shell提供了模式匹配(p a t t e r n-m a t c h i n g)运算符(在表1 6-3列出),可以使用它们去剥除路径名组件。表16-3 Korn shell的模式匹配运算符运算符描述$v a r i a b l e#p a t t e r n 删除变量和p a t t e r n匹配的从头开始的最短的部分并返回剩下的部分$v a r i a b l e#p a t t e r
21、n 删除变量和p a t t e r n匹配的从头开始的最长的部分并返回剩下的部分$v a r i a b l e%p a t t e r n 删除变量和p a t t e r n匹配的从末尾开始的最短的部分并返回剩下的部分$v a r i a b l e%p a t t e r n 删除变量和p a t t e r n匹配的从末尾开始的最长的部分并返回剩下的部分210第六部分 shell编程介绍下载下例说明所有的运算符是如何工作的,使用/*/模式去匹配两个/之间的任何内容,并用.*来匹配点后的所有内容:6.C shell路径的剥除C shell提供一组修改命令,可以使用它们去剥除不需要的变量
22、部分。这些修改命令在剥除路径名时是十分有用的,它们也可以修改变量字符串。表1 6-4列出C shell变量修改符。表16-4 C shell中的变量修改符修改符描述:e删除前缀(以“点“结尾的部分):h删除末尾的文件名部分:r删除后缀(以“点“开始的部分):t删除目录部分:q强制变量进行引用(用来引用$a rg v):x和q选项一样,只是在碰到空格,制表符或新行时产生一个词下列例子表明前四个变量修改命令的结果:16.2.2 内置shell变量所有的三种s h e l l都有一组被s h e l l初始化的单字符变量,像表1 6-5中列出的一样。可以使用这些变量去访问变量中的值并可以返回变量的其
23、他一些信息。在C shell和B o u r n e、Korn shell中对这些变量的使用是不同的。表16-5 由s h e l l初始化的变量变量解释$*B o u r n e或Korn shell:列出命令行参数的值。它只能在脚本中使用,因为登录 s h e l l并没有参数C shell:不使用它,用$a rg v代替$#B o u r n e或Korn shell:列出命令行参数的数目。在脚本中使用C shell:返回变量数组中的变量个数第16章 编写shell脚本211下载(续)变量解释$?B o u r n e或Korn shell:返回上一个命令执行后的退出状态。对于很多命令退
24、出状态为0表明命令被成功执行了,而非 0的退出状态表明执行中有错。这个变量在命令被执行之后设置C shell:用来检测一个变量是否被设置$All shells:返回当前s h e l l的进程号$!B o u r n e或Korn shell:返回在后台运行的上一个进程的进程号在B o u r n e和Korn shell中,可以在一个脚本中使用$*变量得到命令行参数的值,并可使用$#变量得到参数的个数在下面的例子中,s h e l l使用$*变量来得到脚本所有的命令行参数:如果将脚本命名为t r y i t并带着三参数来执行这个脚本,它会用$#来显示参数的个数,并用$*参数来显示各个参数的值
25、。输入字符串可以包含引用。参考 s h(1)的参考页以获取更多的关于引用是如何被解释的信息。在C shell中,$#v a r i a b l e命令将返回变量数组中变量个数,如下所示:在Bourne shell中,$?v a r i a b l e显示上一次命令执行后的退出状态;它显示这个信息的方式和在C shell中的状态变量的方式是相同的。可以参考”退出状态”部分,其中有一个例子。在C shell中,可以使用变量$?v a r i a b l e去测试变量是否已经设置。如果$?v a r i a b l e返回是1,则说明变量存在。是0的话,说明变量并不存在。注意 由$?variable
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell 编程 介绍

限制150内