05_外壳编程.pdf

上传人:asd****56 文档编号:70332372 上传时间:2023-01-19 格式:PDF 页数:13 大小:335.04KB
返回 下载 相关 举报
05_外壳编程.pdf_第1页
第1页 / 共13页
05_外壳编程.pdf_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《05_外壳编程.pdf》由会员分享,可在线阅读,更多相关《05_外壳编程.pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、下载第5章 外 壳 编 程在DOS 中,你可能会从事一些例行的重复性命令,此时你会将这些重复性的命令写成批处理命令,只要执行这个批处理命令就等于执行这些命令。在 L i n u x系统中也有类似的批处理命令,它的功能比起D O S的批处理命令更为强大,相对也较为复杂,已经和一般的高级语言不相上下。这些批处理命令在L i n u x中叫做外壳脚本(外壳Script)。外壳脚本是以文本方式储存的,而非二进制文件。所以外壳脚本必须在 L i n u x系统的外壳下解释执行。不同外壳的脚本大多会有一些差异,所以我们不能将写给 A 外壳的脚本用B 外壳执行。而在L i n u x系统中大家最常使用是Bo

2、urne 外壳以及C 外壳,所以本章结合这两个外壳的相同点和不同点来介绍外壳编程。5.1 创建和运行外壳程序5.1.1 创建外壳程序你可以用任何的编辑器编辑外壳程序,只需将要执行的外壳或 L i n u x命令写入外壳程序即可。例如,假设你的系统在启动时挂接有一台 CD-ROM 驱动器,而你想更换驱动器中的CD,并读取其中的内容。一种方法是:首先把想要读取的 CD 放入 CD-ROM 驱动器中,然后使用unmount 命令卸载CD-ROM 驱动器,最后再使用mount 命令挂接CD-ROM 驱动器。命令如下:umount/dev/cdrommount-t iso9660/dev/cdrom/c

3、drom你可以创建一个包含这两个命令的文件名为 remount 的外壳程序,而不必在每次更换 C D都重复执行这两个命令。5.1.2 运行外壳程序如何运行我们已经写好的外壳脚本呢?可以有四种方法,下面分别介绍这几种方法:1.可以把外壳脚本的权限设置为可执行,这样就可以在外壳提示符下直接执行。我们可以使用下列命令更改外壳脚本的权限chmod u+x filename只有自己可以执行,其他人不能执行。chmod ug+x filename只有自己以及同一工作组的人可以执行,其他人不能执行。chmod+x filename所有人都可以执行。而我们如何指定使用哪一个外壳来解释执行外壳脚本呢?几种基本的

4、指定方式如下所述1)如果外壳脚本的第一个非空白字符不是“#”,则它会使用Bourne 外壳。2)如果外壳脚本的第一个非空白字符是“#”,但不以“#!”开头时,则它会使用C 外壳。3)如果外壳脚本以“#!”开头,则“#!”后面所跟的字符串就是所使用的外壳的绝对路径第二篇L i n u x高级语言及管理编程名。Bourne 外壳的路径名称为/bin/sh,而C 外壳则为/b i n/c s h。例如:1)如使用Bourne 外壳,可用以下方式:echo enter filename或者#!/bin/sh 2)如使用C 外壳,可用以下方式:#C 外壳S c r i p t或者#!/b i n/c s

5、 h3)如使用/etc/perl 作为外壳,可用以下方式:#!/etc/perl 2.第二种方法是执行外壳脚本想要执行的外壳,其后跟随外壳脚本的文件名作为命令行参数。例如,使用tcsh 执行上面的外壳脚本:tcsh remount此命令启动一个新的外壳,并令其执行remount 文件。3.第三种方法是在pdksh 和b a s h下使用.命令,或在t c s h下使用source 命令。例如,在p d k s h和b a s h下执行上面的外壳脚本:.r e m o u n t或在t c s h下执行上面的外壳脚本:source remount4.第四种方法是使用命令替换。这是一个相当有用的方

6、法。如果想要使某个命令的输出成为另一个命令的参数时,就可以使用这个方法。我们将命令列于两个 号之间,而外壳会以这个命令执行后的输出结果代替这个命令以及两个 符号。例如:str=Current directory is pwdecho$str结果如下Current directory is/users/cc/mgtsai在上面的例子中,pwd 这个命令输出/u s e r s/c c/m g t s a i,而后整个字符串代替原来的p w d设定str 变量,所以str 变量的内容则会包括pwd 命令的输出。5.2 使用外壳变量就像其他的任何高级语言一样,在外壳脚本中使用变量也是十分重要的。5.

7、2.1 给变量赋值在pdksh 和b a s h中,给变量赋值的方法是一样的,既在变量名后跟着等号和变量值。例如,想要把5赋给变量c o u n t,则使用如下的命令:count=5 (注意,在等号的两边不能有空格)在t c s h中,可以使用如下的命令:set count=5因为外壳语言是一种不需要类型检查的解释语言,所以在使用变量之前无须事先定义,这36计计第二篇 Linux高级语言及管理编程下载和C 或 P a s c a l语言不一样。这也说明你可以使用同一个变量来存储字符串或整数。给字符串赋值的方法和给整数赋值的方法一样。例如:n a m e=G a r r y(在pdksh 和b

8、a s h中)set name=Garry(在t c s h中)5.2.2 读取变量的值可以使用$读取变量的值。例如,用如下的命令将 count 变量的内容输出到屏幕上:echo$count5.2.3 位置变量和其他系统变量位置变量用来存储外壳程序后面所跟的参数。第一个参数存储在变量 1中,第二个参数存储在变量2中,依次类推。这些变量为系统保留变量,所以你不能为这些变量赋值。同样,你可以使用$来读取这些变量的值。例如,你可以编写一个外壳程序 r e v e r s e,执行过程中它有两个变量。输出时,将两个变量的位置颠倒。#program reverse,prints the command

9、line parameters out in reverse orderecho$2$1在外壳下执行此外壳程序:reverse hello there其输出如下:there hello除了位置变量以外,还有其他的一些系统变量,下面分别加以说明:有些变量在启动外壳时就已经存在于系统中,你可以使用这些系统变量,并且可以赋予新值:$HOME 用户自己的目录。$PATH 执行命令时所搜寻的目录。$TZ 时区。$MAILCHECK 每隔多少秒检查是否有新的邮件。$P S 1在外壳命令行的提示符。$P S 2当命令尚未打完时,外壳要求再输入时的提示符。$M A N PATHman 指令的搜寻路径。有些变量

10、在执行外壳程序时系统就设置好了,并且你不能加以修改:$#存储外壳程序中命令行参数的个数。$?存储上一个执行命令的返回值。$0存储外壳程序的程序名。$*存储外壳程序的所有参数。“$”存储所有命令行输入的参数,分别表示为(“$1”“$2”.)。$存储外壳程序的P I D。$!存储上一个后台执行命令的P I D。5.2.4 引号的作用在外壳编程中,各种不同的引号之间的区别是十分重要的。单引号()、双引号(“”)和第5章计外 壳 编 程计计37下载反斜杠()都用作转义。这三者之中,双引号的功能最弱。当你把字符串用双引号括起来时,外壳将忽略字符串中的空格,但其他的字符都将继续起作用。双引号在将多于一个单

11、词的字符串赋给一个变量时尤其有用。例如,把字符串hello there赋给变量g r e e t i n g时,应当使用下面的命令:greeting=hello there(在 bash 和p d k s h环境下)set greeting=hello there(在 t c s h环境下)这两个命令将hello there作为一个单词存储在greeting 变量中。如果没有双引号,bash 和p d k s h将产生语法错,而t c s h则将hello 赋给变量greeting。单引号的功能则最强。当你把字符串用单引号括起来时,外壳将忽视所有单引号中的特殊字符。例如,如果你想把登录时的用户

12、名也包括在 g r e e t i n g变量中,应该使用下面的命令:greeting=hello there$LOGNAME(在 bash 和p d k s h环境下)set greeting=hello there$LOGNAME(在 t c s h环境下)这将会把hello there root存储在变量greeting 中,如果你是以root 身份登录的话。但如果你在上面使用单引号,则单引号将会忽略$符号的真正作用,而把字符串hello there$LOGNAME存储在greeting 变量中。使用反斜杠是第三种使特殊字符发生转义的方法。反斜杠的功能和单引号一样,只是反斜杠每次只能使一

13、个字符发生转义,而不是使整个字符串发生转义。请看下面的例子:greeting=hello there (在b a s h和p d k s h环境下)set greeting=hello there (在t c s h环境下)在命令中,反斜杠使外壳忽略空格,从而将hello there作为一个单词赋予变量g r e e t i n g。当你想要将一个特殊的字符包含在一个字符串中时,反斜杠就会特别地有用。例如,你想把一盒磁盘的价格$5.0 0赋予变量d i s k _ p r i c e,则使用如下的命令:d i s k _ p r i c e=$5.0 0(在 bash 和p d k s h环境

14、下)set disk_price=$5.00(在t c s h环境下)如果没有反斜杠,外壳就会试图寻找变量5,并把变量5的值赋给d i s k _ p r i c e。5.3 数值运算命令如果需要处理数值运算,我们可以使用 e x p r命令,下面列出可以使用的数值运算符及其用法:expr expression说明:e x p r e s s i o n是由字符串以及运算符所组成的,每个字符串或是运算符之间必须用空格隔开。下面列出了运算符的种类及功能,运算符的优先顺序以先后次序排列,可以利用小括号来改变运算的优先次序。其运算结果输出到标准输出设备上。:字符串比较。比较的方式是以两字符串的第一个

15、字母开始,以第二个字符串的最后一个字母结束。如果相同,则输出第二个字串的字母个数,如果不同则返回 0。*乘法/除法 取余数+加法-减法 小于38计计第二篇 Linux高级语言及管理编程下载=大于等于 大于&AND运算|OR运算注意当expression中含有*、(、)等符号时,必须在其前面加上,以免被外壳解释成其他意义。例如:expr 2*(3+4)输出结果为1 4。t e s t命令在bash 和p d k s h环境中,t e s t命令用来测试条件表达式。其用法如下:test expression或者 expression t e s t命令可以和多种系统运算符一起使用。这些运算符可以分

16、为四类:整数运算符、字符串运算符、文件运算符和逻辑运算符。1)整数运算符int1-eq int2 如果int1 和i n t 2相等,则返回真。int1-ge int2 如果int1 大于等于i n t 2,则返回真。int1-gt int2 如果int1 大于i n t 2,则返回真。int1-le int2 如果i n t 1小于等于i n t 2,则返回真。int1-lt int2 如果i n t 1小于i n t 2,则返回真。int1-ne int2 如果int1 不等于i n t 2,则返回真。2)字符串运算符str1=str2 如果str1 和s t r 2相同,则返回真。str

17、1!=str2 如果str1 和s t r 2不相同,则返回真。str 如果str 不为空,则返回真。-n str 如果str 的长度大于零,则返回真。-z str 如果str 的长度等于零,则返回真。3)文件运算符-d filename 如果filename 为目录,则返回真。-f filename 如果filename 为普通的文件,则返回真。-r filename 如果filename 可读,则返回真。-s filename 如果filename 的长度大于零,则返回真。-w filename 如果filename 可写,则返回真。-x filename 如果filename 可执行,则

18、返回真。4)逻辑运算符!expr 如果expr 为假,则返回真。第5章计外 壳 编 程计计39下载expr1-a expr2如果expr1 和e x p r 2同时为真,则返回真。expr1-o expr2如果expr1 或 e x p r 2有一个为真,则返回真。t c s h中没有t e s t命令,但它同样支持表达式。t c s h支持的表达式形式基本上和 C语言一样。这些表达式大多数用在if 和w h i l e命令中。t c s h表达式的运算符也分为整数运算符、字符串运算符、文件运算符和逻辑运算符四种。1)整数运算符int1=int2 如果int1 大于等于i n t 2,则返回真

19、。int1 int2 如果int1 大于i n t 2,则返回真。2)字符串运算符str1=str2如果str1 和s t r 2相同,则返回真。str1!=str2如果str1 和s t r 2不相同,则返回真。)文件运算符-r file如果f i l e可读,则返回真。-w file如果f i l e可写,则返回真。-x file如果f i l e可执行,则返回真。-e file如果f i l e存在,则返回真。-o file如果当前用户拥有file,则返回真。-z file如果file 长度为零,则返回真。-f file如果file 为普通文件,则返回真。-d file如果file 为目

20、录,则返回真。4)逻辑运算符exp1|exp2 如果exp1 为真或exp2 为真,则返回真。exp1&exp2 如果exp1 和e x p 2同时为真,则返回真。!exp 如果exp 为假,则返回真。5.4 条件表达式b a s h、p d k s h和tcsh 都有两种条件表达方法,即if 表达式和case 表达式。5.4.1 if 表达式b a s h、p d k s h和tcsh 都支持嵌套的if.then.else 表达式。bash 和pdksh 的if 表达式如下:if expression t h e nc o m m a n d selif expression2 t h e

21、nc o m m a n d se l s ec o m m a n d sf ielif 和else 在if 表达式中均为可选部分。e l i f是else if的缩写。只有在i f表达式和任何在它之40计计第二篇 Linux高级语言及管理编程下载前的e l i f表达式都为假时,才执行e l i f。f i关键字表示i f表达式的结束。在t c s h中,i f表达式有两种形式。第一种形式为:if(expression1)thenc o m m a n d selse if(expression2)thenc o m m a n d se l s ec o m m a n d se n d

22、 i ft c s h的第二种形式是第一种形式的简写。它只执行一个命令,如果表达式为真,则执行,如果表达式为假,则不做任何事。其用法如下:if(expression)command下面是一个bash 或 pdksh 环境下if 表达式的例子。它用来查看在当前目录下是否存在一个叫.p r o f i l e的文件:if -f.profile t h e necho There is a.profile file in the current directory.e l s eecho Could not find the.profile file.f i在t c s h环境下为:#if(-f.p

23、rofile )thenecho There is a.profile file in the current directory.e l s eecho Could not find the.profile file.e n d i f5.4.2 case 表达式c a s e表达式允许你从几种情况中选择一种情况执行。外壳中的 c a s e表达式的功能要比P a s c a l或C语言的case 或s w i t c h语句的功能稍强。这是因为在外壳中,你可以使用c a s e表达式比较带有通配符的字符串,而在Pascal 和C语言中你只能比较枚举类型和整数类型的值。bash 和p d k

24、 s h的c a s e表达式如下:case string1 ins t r 1)c o m m a n d s;s t r 2)c o m m a n d s;*)c o m m a n d s;e s a c在此,将string1 和s t r 1、s t r 2比较。如果str1 和s t r 2中的任何一个和s t r i n g s 1相符合,则它下面的命令一直到两个分号(;)将被执行。如果str1 和s t r 2中没有和s t r i n g s 1相符合的,则星号(*)下面的语句被执行。星号是缺省的c a s e条件,因为它和任何字符串都匹配。t c s h的选择语句称为开关语

25、句。它和C语言的开关语句十分类似。switch(string1)case str1:第5章计外 壳 编 程计计41下载s t a t e m e n t sb r e a k s wcase str2:s t a t e m e n t sb r e a k s wd e f a u l t:s t a t e m e n t sb r e a k s we n d s w在此,s t r i n g 1和每一个c a s e关键字后面的字符串相比较。如果任何一个字符串和 s t r i n g 1相匹配,则其后面的语句直到 b r e a k s w将被执行。如果没有任何一个字符串和 s t

26、 r i n g 1匹配,则执行d e f a u l t后面直到b r e a k s w的语句。下面是bash 或 p d k s h环境下c a s e表达式的一个例子。它检查命令行的第一个参数是否为-i 或e。如果是-i,则计算由第二个参数指定的文件中以i开头的行数。如果是-e,则计算由第二个参数指定的文件中以e开头的行数。如果第一个参数既不是-i也不是-e,则在屏幕上显示一条的错误信息。case$1 in-i)count=grep i$2|wc-l echo The number of lines in$2 that start with an i is$count;-e)count

27、=grep e$2|wc-lecho The number of lines in$2 that start with an e is$count;*)echo That option is not recognized;e s a c此例在tcsh 环境下为:#remember that the first line must start with a#when using tcshswitch($1)case-i|i:set count=grep i$2|wc-lecho The number of lines in$2 that begin with i is$countb r e a

28、k s wcase-e|e:set count=grep e$2|wc-lecho The number of lines in$2 that begin with e is$countb r e a k s wd e f a u l t:echo That option is not recognizedb r e a k s we n d s w5.5 循环语句外壳中提供了几种循环语句,最为常用的是f o r表达式。42计计第二篇 Linux高级语言及管理编程下载5.5.1 for 语句bash 和p d k s h中有两种使用for 语句的表达式。第一种形式是:for var1 in l

29、istd oc o m m a n d sd o n e在此形式时,对在list 中的每一项,f o r语句都执行一次。L i s t可以是包括几个单词的、由空格分隔开的变量,也可以是直接输入的几个值。每执行一次循环,v a r 1都被赋予l i s t中的当前值,直到最后一个为止。第二种形式是:for var1d os t a t e m e n t sd o n e使用这种形式时,对变量v a r 1中的每一项,f o r语句都执行一次。此时,外壳程序假定变量v a r 1中包含外壳程序在命令行的所有位置参数。一般情况下,此种方式也可以写成:for var1 in$d os t a t e

30、 m e n t sd o n e在t c s h中,f o r循环语句叫做f o r e a c h。其形式如下:foreach name(list)c o m m a n d se n d下面是一个在bash 或 p d k s h环境下的例子。此程序可以以任何数目的文本文件作为命令行参数。它读取每一个文件,把其中的内容转换成大写字母,然后将结果存储在以.c a p s作为扩展名的同样名字的文件中。for filed otr a-z A-Z$file.capsd o n e在t c s h环境下,此例子可以写成:#foreach file($*)tr a-z A-Z$file.capse

31、n d5.5.2 while 语句while 语句是另一种循环语句。当一个给定的条件为真时,则一直循环执行下面的语句直到条件为假。在bash 和p d k s h环境下,使用while 语句的表达式为:while expressiond os t a t e m e n t s第5章计外 壳 编 程计计43下载d o n e而在t c s h中,while 语句为:while(expression)s t a t e m e n t se n d下面是在bash 和p d k s h中w h i l e语句的一个例子。程序列出所带的所有参数,以及他们的位置号。c o u n t=1while

32、-n$*d oecho This is parameter number$count$1s h i f tcount=expr$count+1d o n e其中s h i f t命令用来将命令行参数左移一个。在t c s h中,此例子为:#set count=1while($*!=)echo This is parameter number$count$1s h i f tset count=expr$count+1e n d5.5.3 until 语句until 语句的作用和w h i l e语句基本一样,只是当给定的条件为假时,执行 until 语句。u n t i l语句在bash 和p

33、 d k s h中的写法为:until expressiond oc o m m a n d sd o n e让我们用u n t i l语句重写上面的例子:c o u n t=1until -z$*d oecho This is parameter number$count$1s h i f tcount=expr$count+1d o n e在应用中,u n t i l语句不是很常用,因为u n t i l语句可以用w h i l e语句重写。5.6 shift 命令b a s h、p d k s h和t c s h都支持shift 命令。shift 命令用来将存储在位置参数中的当前值左移一

34、个位置。例如当前的位置参数是:$1=-r$2=file1$3=file2执行shift 命令:s h i f t44计计第二篇 Linux高级语言及管理编程下载位置参数将会变为:$1=file1$2=file2你也可以指定shift 命令每次移动的位置个数。下面的例子将位置参数移动两个位置:shift 2下面是一个应用shift 命令的例子。此程序有两个命令行参数,一个代表输入文件,另一个代表输出文件。程序读取输入文件,将其中的内容转换成大写,并将结果存储在输出文件中。while$1 d oif$1=-i theni n f i l e=$2 shift 2elif$1=-o t h e no

35、 u t f i l e=$2 shift 2e l s eecho Program$0 does not recognize option$1f id o n etr a-z A-Z$outfile5.7 select 语句select 语句只存在于p d k s h中,在bash 或 t c s h中没有相似的表达式。select 语句自动生成一个简单的文字菜单。其用法如下:select menuitem in list_of_itemsd oc o m m a n d sd o n e其中方括号中是s e l e c t语句的可选部分。当s e l e c t语句执行时,p d k s

36、h为在l i s t _ o f _ i t e m s中的每一项创建一个标有数字的菜单项。l i s t _ o f _ i t e m s可以是包含几个条目的变量,就像choice1 choice2,或者是直接在命令中输入的选择项,例如:select menuitem in choice1 choice2 choice3如果没有l i s t _ o f _ i t e m s,s e l e c t语句则使用命令行的位置参数,就像f o r表达式一样。一旦你选择了菜单项中的一个,s e l e c t语句就选中的菜单项的数字值存储在变量 m e n u i t e m中。然后你可以利用d

37、 o中的语句来执行选中的菜单项要执行的命令。下面是s e l e c t语句的一个例子。select menuitem in pick1 pick2 pick3d oecho Are you sure you want to pick$menuitemread resif$res=y-o$res=Y t h e nb r e a kf id o n e第5章计外 壳 编 程计计45下载5.8 repeat 语句repeat 语句只存在于t c s h中,在pdksh 和b a s h中没有相似的语句。repeat 语句用来使一个单一的语句执行指定的次数。repeat 语句如下:repeat c

38、ount command下面给出repeat 语句的一个例子。它读取命令行后的一串数字,并根据数字在屏幕上分行输出句号。#foreach num($*)repeat$num echo-n.echo e n d任何repeat 语句都可以用while 或 f o r语句重写。r e p e a t语句只是更加方便而已。5.9 子函数外壳语言可以定义自己的函数,就像在C 或其他语言中一样。使用函数的最大好处就是程序更为清晰可读。下面是如何在bash 和p d k s h中创建一个函数:fname()s h e l l c o m m a n d s在p d k s h中也可以使用如下的形式:fun

39、ction fname s h e l l c o m m a n d s使用函数时,只须输入以下的命令:fname parm1 parm2 parm3.tcsh 外壳中不支持函数。你可以传递任何数目的参数给一个函数。函数将会把这些参数视为位置参数。请看下面的例子。此例子包括四个函数:upper()、lower()、print()和usage_error(),他们的任务分别是:将文件转换成大写字母、将文件转换成小写字母、打印文件内容和显示出错信息。upper()、lower()、print()都可以有任意数目的参数。如果将此例子命名为 c o n v e r t,你可以在外壳提示符下这样使用该

40、程序:convert-u file1 file2 file3。upper()s h i f tfor id otr a-z A-Z$1.outrm$1mv$1.out$1s h i f tdone;lower()s h i f tfor id o46计计第二篇 Linux高级语言及管理编程下载tr A-Z a-z$1.outrm$1mv$1.out$1s h i f tdone;print()s h i f tfor id olpr$1s h i f tdone;usage_error()echo$1 syntax is$1 echo echo where option is one of the followingecho p to print frame filesecho u to save as uppercaseecho l to save as lowercase;case$1i np|-p)print$;u|-u)upper$;l|-l)lower$;*)usage_error$0;e s a c虽然外壳语言功能强大而且简单易学,但你会发现在有些情况下,外壳语言无法解决你的问题。这时,你可以选择L i n u x系统中的其他语言,例如C 和C+、g a w k、以及P e r l等。第5章计外 壳 编 程计计47下载

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁