楼主: bnso

Linux Shell介绍

[复制链接]
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
151#
 楼主| 发表于 2006-8-13 19:16 | 只看该作者
19.5 函数返回值测试
可以直接在脚本调用函数语句的后面使用最后状态命令来测试函数调用的返回值。例如:
更好的办法是使用i f语句测试返回0或者返回1。最好在i f语句里用括号将函数调用括起来
以增加可读性。例如:
如果函数将从测试结果中反馈输出,那么使用替换命令可保存结果。函数调用的替换格
式为:
v a r i a b l e _ n a m e = f u n c t i o n _ n a m e
函数f u n c t i o n _ n a m e输出被设置到变量v a r i a b l e _ n a m e中。
不久我们会接触到许多不同的函数及使用函数的返回值和输出的不同方法。
19.6 在shell中使用函数
当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入s h e l l。
文件头应包含语句# ! / b i n / s h,文件名可任意选取,但最好与相关任务有某种实际联系。例
如,f u n c t i o n s . m a i n。
一旦文件载入s h e l l,就可以在命令行或脚本中调用函数。可以使用s e t命令查看所有定义
的函数。输出列表包括已经载入s h e l l的所有函数。
如果要改动函数,首先用u n s e t命令从s h e l l中删除函数,尽管u n s e t删除了函数以便于此函
数对于s h e l l或脚本不可利用,但并不是真正的删除。改动完毕后,再重新载入此文件。有些
s h e l l会识别改动,不必使用u n s e t命令,但为了安全起见,改动函数时最好使用u n s e t命令。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
152#
 楼主| 发表于 2006-8-13 19:16 | 只看该作者
19.7 创建函数文件
下面创建包容函数的函数文件并将之载入s h e l l,进行测试,再做改动,之后再重新载入。
函数文件名为f u n c t i o n s . m a i n,内容如下:
204 第四部分基础s h e l l编程
下载
上述脚本本书前面用过,现在将之转化为一个函数。这是一个基本f i n d命令的前端。如果
不加参数,函数将返回1,即发生错误。注意错误语句中用到了实际函数名,因为这里用$ 0,
s h e l l将只返回s h -信息,原因是文件并不是一个脚本文件。这类信息对用户帮助不大。
19.8 定位文件
定位文件格式为:
. / p a t h n a m e / f i l e n a m e
现在文件已经创建好了,要将之载入s h e l l,试键入:
$. functions.main
如果返回信息file not found,再试:
$. /functions.main
此即<点> <空格> <斜线> <文件名>,现在文件应该已载入s h e l l。如果仍有错误,则应该仔
细检查是否键入了完整路径名。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
153#
 楼主| 发表于 2006-8-13 19:17 | 只看该作者
19.9 检查载入函数
使用s e t命令确保函数已载入。s e t命令将在s h e l l中显示所有的载入函数。
19.10 执行shell函数
要执行函数,简单地键入函数名即可。这里是带有一个参数的f i n d i t函数,参数是某个系
统文件。
第19章shell 函数205
下载
19.10.1 删除shell函数
现在对函数做一些改动。首先删除函数,使其对s h e l l不可利用。使用u n s e t命令完成此功
能。删除函数时u n s e t命令格式为:
unset function_name
$ unset findit
如果现在键入s e t命令,函数将不再显示。
19.10.2 编辑shell函数
编辑函数f u n c t i o n s . m a i n,加入f o r循环以便脚本可以从命令行中读取多个参数。改动后函
数脚本如下:
再次定位函数
$. /functions.main
使用s e t命令查看其是否被载入,可以发现s h e l l正确解释f o r循环以接受所有输入参数。
现在执行改动过的f i n d i t函数,输入两个参数

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
154#
 楼主| 发表于 2006-8-13 19:17 | 只看该作者
19.10.3 函数举例
既然已经学习了函数的基本用法,现在就用它来做一些工作。函数可以节省大量的编程
时间,因为它是可重用的。
1. 变量输入
以下脚本询问名,然后是姓。
要求输入字符必须只包含字母。如果不用函数实现这一点,要写大量脚本。使用函数可
以将重复脚本删去。这里用a w k语言测试字符。以下是取得只有小写或大写字符的测试函数。
首先设置变量$ 1为一有意义的名字,然后用a w k测试整个传送记录只包含字母,此命令输
出(1为非字母,空为成功)保存在变量_ L E T T E R S _ O N LY中。
然后执行变量测试,如果为空,则为成功,如果有值,则为错误。基于此项测试,返回
码然后被执行。在对脚本的函数调用部分进行测试时,使用返回值会使脚本清晰易懂。
使用i f语句格式测试函数功能:
如果有错误,可编写一个函数将错误反馈到屏幕上。
第19章shell 函数207
下载
函数n a m e _ e r r o r用于显示所有无效输入错误。使用特殊变量$ @显示所有参数,这里为变
量F _ N A M E和S _ N A M E值。完成脚本如下:
注意每个输入的w h i l e循环,这将确保不断提示输入直至为正确值,然后跳出循环。当然,
208 第四部分基础s h e l l编程
下载
实际脚本拥有允许用户退出循环的选项,可使用适当的游标,正像控制0长度域一样。
2. echo问题
e c h o语句的使用类型依赖于使用的系统是L I N U X、B S D还是系统V,本书对此进行了讲解。
下面创建一个函数决定使用哪种e c h o语句。
使用e c h o时,提示应放在语句末尾,以等待从r e a d命令中接受进一步输入。
L I N U X和B S D为此使用e c h o命令- n选项。
以下是L I N U X(B S D)e c h o语句实例,这里提示放于e c h o后面:
系统V使用\ C保证在末尾提示:
在e c h o语句开头L I N U X使用- e选项反馈控制字符。其他系统使用反斜线保证s h e l l获知控
制字符的存在。
有两种方法测试e c h o语句类型,下面讲述这两种方法,这样,就可以选择使用其中一个。
第一种方法是在e c h o语句里包含测试控制字符。如果键入\ 0 0 7和一个警铃,表明为系统V,
如果只键入\ 0 0 7,显示为L I N U X。
以下为第一个控制字符测试函数。
注意这里又用到了特殊变量$ @以反馈字符串,要在脚本中调用上述函数,可以使用:
uni_prompt "\007 there goes the bell ,What is your name:"
这将发出警报并反馈‘ What is your name:’,并在行尾显示字符串。如果在末尾出现字
符,则为系统V版本,否则为L I N U X / B S D版本。
第二种方法使用系统V \c测试字母z是否悬于行尾。
第19章shell 函数209
下载
要在脚本中调用上述函数,可以使用:
uni_prompts "\007 there goes the ,bWehlalt is your name:"
使用两个函数中任意一个,并加入一小段脚本:
将产生下列输出:
There goes the be,llWhat is your name:
3. 读单个字符
在菜单中进行选择时,最麻烦的工作是必须在选择后键入回车键,或显示“ press any key
to continue”。可以使用d d命令解决不键入回车符以发送击键序列的问题。
d d命令常用于对磁带或一般的磁带解压任务中出现的数据问题提出质疑或转换,但也可
用于创建定长文件。下面创建长度为1兆的文件m y f i l e。
dd if:/dev/zero of=myfile count=512 bs=2048
d d命令可以翻译键盘输入,可被用来接受多个字符。这里如果只要一个字符, d d命令需
要删除换行字符,这与用户点击回车键相对应。d d只送回车前一个字符。在输入前必须使用
s t t y命令将终端设置成未加工模式,并在d d执行前保存设置,在d d完成后恢复终端设置。
函数如下:
要调用函数,返回键入字符,可以使用命令替换操作,例子如下:
210 第四部分基础s h e l l编程
下载
4. 测试目录存在
拷贝文件时,测试目录是否存在是常见的工作之一。以下函数测试传递给函数的文件名
是否是一个目录。因为此函数返回时带有成功或失败取值,可用i f语句测试结果。
函数如下:
要调用函数并测试结果,可以使用:
5. 提示Y或N
许多脚本在继续处理前会发出提示。大约可以提示以下动作:
• 创建一个目录。
• 是否删除文件。
• 是否后台运行。
• 确认保存记录。
等等
以下函数是一个真正的提示函数,提供了显示信息及缺省回答方式。缺省回答即用户按
下回车键时采取的动作。c a s e语句用于捕获回答。
第19章shell 函数211
下载
要调用上述函数,须给出显示信息或参数$ 1,或字符串变量。缺省回答Y或N方式也必须
指定。
以下是几种函数c o n t i n u e _ p r o m p t的调用格式。
在脚本中加入上述语句,给出下列输入:
现在可以看出为什么函数要有指定的缺省回答。
以下是函数调用的另一种方式:
212 第四部分基础s h e l l编程
下载
也可以使用字符串变量$ 1调用此函数:
6. 从登录I D号中抽取信息
当所在系统很庞大,要和一登录用户通信时,如果忘了用户的全名,这是很讨厌的事。
比如有时你看到用户锁住了一个进程,但是它们的用户I D号对你来说没有意义,因此必须要
用grep passwd文件以取得用户全名,然后从中抽取可用信息,向其发信号,让其他用户开锁。
以下函数用于从grep /etc/passwd命令抽取用户全名。
本系统用户全名位于p a s s w d文件域5中,用户的系统可能不是这样,这时必须改变其域号
以匹配p a s s w d文件。
这个函数需要一个或多个用户I D号作为参数。它对密码文件进行g r e p操作。
函数脚本如下:
以下为w h o i s函数调用方式

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
155#
 楼主| 发表于 2006-8-13 19:18 | 只看该作者
7. 列出文本文件行号
在v i编辑器中,可以列出行号来进行调试,但是如果打印几个带有行号的文件,必须使用
n l命令。以下函数用n l命令列出文件行号。原始文件中并不带有行号。
第19章shell 函数213
下载
要调用n u m b e r _ f i l e函数,可用一个文件名做参数,或在s h e l l中提供一文件名,例如:
$ number_file myfile
也可以在脚本中这样写或用:
number_file $1
输出如下:
8. 字符串大写
有时需要在文件中将字符串转为大写,例如在文件系统中只用大写字符创建目录或在有
效的文本域中将输入转换为大写数据。
以下是相应功能函数,可以想像要用到t r命令:
变量u p p e r 保存返回的大写字符串,注意这里用到特定参数$ @来传递所有参数。
s t r _ t o _ u p p e r可以以两种方式调用。在脚本中可以这样指定字符串。
或者以函数输入参数$ 1的形式调用它。
214 第四部分基础s h e l l编程
下载
两种方法均可用替换操作以取得函数返回值。
9. is_upper
虽然函数s t r _ t o _ u p p e r做字符串转换,但有时在进一步处理前只需知道字符串是否为大写。
i s _ u p p e r实现此功能。在脚本中使用i f语句决定传递的字符串是否为大写。
函数如下:
要调用i s _ u p p e r,只需给出字符串参数。以下为其调用方式:
要测试字符串是否为小写,只需在函数i s _ u p p e r中替换相应的a w k语句即可。此为
i s _ l o w e r。
10. 字符串小写
现在实现此功能,因为已经给出了s t r _ t o _ u p p e r,最好相应给出s t r _ t o _ l o w e r。函数工作方
式与前面一样。
函数如下:
第19章shell 函数215
下载
变量L O W E R保存最近返回的小写字符串。注意用到特定参数$ @ 传递所有参数。
s t r _ t o _ l o w e r调用方式也分为两种。可以在脚本中给出字符串:
或在函数中用参数代替字符串:
11. 字符串长度
在脚本中确认域输入有效是常见的任务之一。确认有效包括许多方式,如输入是否为数
字或字符;域的格式与长度是否为确定形式或值。
假定脚本要求用户交互输入数据到名称域,你会想控制此域包含字符数目,比如人名最
多为2 0个字符。有可能用户输入超过5 0个字符。以下函数实施控制功能。需要向函数传递两
个参数,实际字符串和字符串最大长度。
函数如下:
调用函数c h e c k _ l e n g t h:
216 第四部分基础s h e l l编程
下载
循环持续直到输入到变量N A M E的数据小于最大字符长度,这里指定为1 0,b r e a k命令然
后跳出循环。
使用上述脚本段,输出结果如下:
可以使用w c命令取得字符串长度。但是要注意,使用w c命令接受键盘输入时有一个误操
作。如果用户输入了一个名字后,点击了几次空格键, w c会将这些空格也作为字符串的一部
分,因而给出其错误长度。a w k在读取键盘时缺省截去字符串末尾处空格。
以下是w c命令的缺点举例(也可以称为特征之一)
运行上述脚本(其中□为空格)
12. chop
c h o p函数删除字符串前面字符。可以指定从第一个字符起删去的字符数。假定有字符串
M Y D O C U M E N T. D O C,要删去M Y D U C U M E N T部分,以便函数只返回. D O C,需要把下述命
令传给c h o p函数:
M Y D O C U M E N T . D O C 1 0
Chop 函数如下:
第19章shell 函数217
下载
删除后字符串保存于变量C H O P P E D中,使用下面方法调用c h o p函数:
或者:
13. MONTHS
产生报表或创建屏幕显示时,为方便起见有时要快速显示完整月份。函数m o n t h s,接受
月份数字或月份缩写作为参数,返回完整月份。
例如,传递3或者0 3可返回M a r c h。函数如下:
218 第四部分基础s h e l l编程
下载
用下面方法调用函数m o n t h s
months 04
上面例子显示A p r i l,脚本中使用:
返回月份J u n e。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
156#
 楼主| 发表于 2006-8-13 19:18 | 只看该作者
19.10.4 将函数集中在一起
本章目前讲到的函数没有一定的顺序。这些例子只表明函数不一定很长或不一定为一些
复杂的脚本。
本书许多函数脚本简单实用,并不需要任何新的后备知识。这些函数只是防止重复输入
脚本,实际上这就是函数的基本功能。
本章开始部分,讲到怎样在s h e l l中使用函数。第一次使用函数时,也许要花一段时间才
能理解其返回值的用法。
本章讲到了几种不同的调用函数及其返回值的方法。如果遇到问题,查看一下实例返回
值及其测试方法即可。
以下是一些小技巧。测试函数时,首先将其作为代码测试,当结果满意时,再将其转换
为函数,这样做可以节省大量的时间。
19.11 函数调用
本章最后讲述使用函数的两种不同方法:从原文件中调用函数和使用脚本中的函数。
19.11.1 在脚本中调用函数
要在脚本中调用函数,首先创建函数,并确保它位于调用之前。以下脚本使用了两个函
数。此脚本前面提到过,它用于测试目录是否存在。
第19章shell 函数219
下载
上述脚本中,两个函数定义于脚本开始部分,并在脚本主体中调用。所有函数都应该在
任何脚本主体前定义。注意错误信息语句,这里使用函数e r r o r _ m s g显示错误,反馈所有传递
到该函数的参数,并加两声警报。
19.11.2 从函数文件中调用函数
前面讲述了怎样在命令行中调用函数,这类函数通常用于系统报表功能。
现在再次使用上面的函数,但是这次将之放入函数文件f u n c t i o n s . s h里。s h意即s h e l l脚本。
220 第四部分基础s h e l l编程
下载
现在编写脚本就可以调用f u n c t i o n s . s h中的函数了。注意函数文件在脚本中以下述命令格
式定位:
.\<path to file>
使用这种方法不会创建另一个s h e l l,所有函数均在当前s h e l l下执行。
运行上述脚本,可得同样输出结果,好像函数在脚本中一样。
第19章shell 函数221
下载
19.12 定位文件不只用于函数
定位文件不只针对于函数,也包含组成配置文件的全局变量。
假定有两个备份文件备份同一系统的不同部分。最好让它们共享一个配置文件。为此需
要在一个文件里创建用户变量,然后将一个备份脚本删除后,可以载入这些变量以获知用户
在备份开始前是否要改变其缺省值。有时也许要备份到不同的媒体中。
当然这种方法可用于共享配置以执行某一过程的任何脚本。下面的例子中,配置文件
b a c k f u n c包含一些备份脚本所共享的缺省环境。文件如下:
缺省文件很清楚,第1域_ C O D E包含一个脚本关键字。要查看并且改变缺省值,用户必须
首先输入匹配_ C O D E取值的脚本,即“c o m e t”。
以下脚本要求输入密码,成功后显示缺省配置。
脚本运行时,首先要求输入脚本。脚本匹配后,可以查看缺省值。然后就可以编写脚本
让用户改变缺省值。
222 第四部分基础s h e l l编程
下载
19.13 小结
使用函数可以节省大量的脚本编写时间。创建可用和可重用的脚本很有意义,可以使主
脚本变短,结构更加清晰。
当创建了许多函数后,将之放入函数文件里,然后其他脚本就可以使用这些函数了。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
157#
 楼主| 发表于 2006-8-13 19:18 | 只看该作者
第20章向脚本传递参数
前面已经讲到如何使用特定变量$ 1 . . $ 9向脚本传递参数。$ #用于统计传递参数的个数。可
以创建一个u s a g e语句,需要时可通知用户怎样以适当的调用参数调用脚本或函数。
本章内容有:
• shift。
• getopts。
• shift和g e t o p t s例子。
简单地说,下述脚本框架控制参数开始与停止。脚本需要两个参数,如果没有输入两个
参数,那么产生一个u s a g e语句。注意这里使用c a s e语句处理输入脚本的不同参数。
执行脚本,输入以下参数,结果为:
任何U N I X或L I N U X命令均接受一般格式:
命令选项文件
选项部分最多可包含1 2个不同的值。上述脚本中,如果必须控制不同的命令选项,就要
加入大量脚本。这里只控制两个选项:开始和停止。
幸运的是s h e l l提供s h i f t命令以帮助偏移选项,使用s h i f t可以去除只使用$ 1到$ 9传递参数的
限制。
20.1 shift命令
向脚本传递参数时,有时需要将每一个参数偏移以处理选项,这就是s h i f t命令的功能。
它每次将参数位置向左偏移一位,下面用一段简单脚本详述其功能。脚本使用w h i l e循环反馈
所有传递到脚本的参数。
你可能想像,上述脚本一直执行,直到命令行中不再有更多的参数输入。错了,因为没
有办法偏移到脚本中下一个参数,将只会反馈出第一个参数。执行结果如下:
20.1.1 shift命令简单用法
使用s h i f t命令来处理传递到脚本的每一个参数。改动后脚本如下:
现在再执行,结果将会不同:
20.1.2 命令行输入的最后一个参数
虽然还没有讲e v a l命令,如果需要知道命令行中输入的最后一个参数(通常是一个文件名),
可以有两种选择:使用命令eval echo \$$#;使用s h i f t命令:shift 'expr $# -2'。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
158#
 楼主| 发表于 2006-8-13 19:19 | 只看该作者
20.1.3 使用shift处理文件转换
s h i f t可使控制命令行选项更加容易。下面构造一个转换脚本,使用t r将文件名转换为大写
或小写。
脚本选项为:
-l 用于小写转换。
-u 用于大写转换。
使用s h i f t命令将脚本放在一起以控制- l和- u选项。脚本的第一版本如下:
首先检查脚本是否有参数,如果没有,打印u s a g e语句,如果有需要处理的参数,使用
c a s e语句捕获每一个传送过来的选项。当处理完此选项后,使用s h i f t命令搜集命令行中下一选
项,如果未发现匹配选项,打印u s a g e语句。
当向脚本传递两个无效参数时,输出如下:
下一步就是要用c a s e语句处理选项后传递过来的文件名。为此需改动c a s e语句。c a s e语句
中捕获任意模式*应该为- *以允许传递无效选项,例如- p或- q。
226 第四部分基础s h e l l编程
下载
*模式也匹配传递过来的所有文件名,以便用f o r循环处理每一个文件,这里也将使用- f选
项检测文件是否存在。
改动后的c a s e语句如下:
还需要指定与选项( - l,- u)相关的变量设置。这些变量是:
T R C A S E 保存转换类型(大写或小写)。
E X T 所有文件转换后,大写文件名为. U C,小写为. L C,不保存初始文件状态。
O P T 如果给出此选项,设其为y e s,否则为n o。如果没有给出此选项,捕获此信息并反
馈出来。
其他部分脚本用于实际转换处理,这里即t r命令。t r命令放在c a s e语句f o r循环中读取文件
名进行处理的脚本末尾部分。
以下为完整脚本:
第20章向脚本传递参数227
下载
228 第四部分基础s h e l l编程
下载
执行上述脚本,给出不同选项,得结果如下:
转换一个不存在的文件:
传递不正确选项:
只键入文件名,希望脚本提示更多帮助信息:
输入两个有效文件及第三个无效文件:
使用上述脚本可以将许多文件转换为同样的格式。编写一段脚本,使其控制不同的命令
行选项,这种方式编程量很大,是一件令人头疼的事。
假定要写一段脚本,要求控制以下各种不同的命令行选项:
命令-l -c 23 -v 文件1文件2
s h i f t命令显得力不从心,这就需要用到g e t o p t s命令。
20.2 getopts
g e t o p t s可以编写脚本,使控制多个命令行参数更加容易。g e t o p t s用于形成命令行处理标
准形式。原则上讲,脚本应具有确认带有多个选项的命令文件标准格式的能力。
20.2.1 getopts脚本实例
通过例子可以更好地理解g e t o p t s。以下g e t o p t s脚本接受下列选项或参数。
• a 设置变量A L L为t r u e。
• h 设置变量H E L P为t r u e。
第20章向脚本传递参数229
下载
• f 设置变量F I L E为t r u e。
• v 设置变量V E R B O S E为t r u e。
对于所有变量设置,一般总假定其初始状态为f a l s e:
g e t o p t s一般格式为:
getopts option_string variable
在上述例子中使用脚本:
while getopts ahfgv OPTION
可以看出w h i l e循环用于读取命令行,o p t i o n _ s t r i n g为指定的5个选项(- a,- h,- f,- g,- v),
脚本中v a r i a b l e为O P T I O N。注意这里并没有用连字符指定每一单个选项。
运行上述脚本,给出几个有效和无效的选项,结果为:
可以看出不同选项的结合方式。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
159#
 楼主| 发表于 2006-8-13 19:19 | 只看该作者
20.2.2 getopts使用方式
g e t o p t s读取o p t i o n _ s t r i n g,获知脚本中使用了有效选项。
g e t o p t s查看所有以连字符开头的参数,将其视为选项,如果输入选项,将把这与
o p t i o n _ s t r i n g对比,如果匹配发现,变量设置为O P T I O N,如果未发现匹配字符,变量能够设
置为?。重复此处理过程直到选项输入完毕。
g e t o p t s接收完所有参数后,返回非零状态,意即参数传递成功,变量O P T I O N保存最后处
理参数,一会儿就可以看出处理过程中这样做的好处。
20.2.3 使用getopts指定变量取值
有时有必要在脚本中指定命令行选项取值。g e t o p t s 为此提供了一种方式,即在
o p t i o n _ s t r i n g中将一个冒号放在选项后。例如:
getopts ahfvc: OPTION
上面一行脚本指出,选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用
选项取值时,必须使用变量O P TA R G保存该值。如果试图不取值传递此选项,会返回一个错
误信息。错误信息提示并不明确,因此可以用自己的反馈信息屏蔽它,方法如下:
将冒号放在o p t i o n _ s t r i n g开始部分。
while getopts :ahfgvc: OPTION
在c a s e语句里使用?创建一可用语句捕获错误。
改动后g e t o p t s脚本如下:
第20章向脚本传递参数231
下载
运行上述脚本,选项- c不赋值,将返回错误,但显示的是脚本语句中的反馈信息:
现在,输入所有合法选项:
20.2.4 访问取值方式
g e t o p t s的一种功能是运行后台脚本。这样可以使用户加入选项,指定不同的磁带设备以
备份数据。使用g e t o p t s实现此任务的基本框架如下:
232 第四部分基础s h e l l编程
下载
上述脚本中如果指定选项d,则需为其赋值。该值为磁带设备路径。用户也可以指定是否
备份输出到登录文件中的内容。运行上述脚本,指定下列输入:
g e t o p t s检查完之后,变量O P TA R G取值可用来进行任何正常的处理过程。当然,如果输
入选项,怎样进行进一步处理及使该选项有有效值,完全取决于用户。
以上是使用g e t o p t s对命令行参数处理的基本框架。
实际处理文件时,使用f o r循环,就像在t r- c a s e脚本中使用s h i f t命令过滤所有选项一样。
使用g e t o p t s与使用s h i f t方法比较起来,会减少大量的编程工作。
20.2.5 使用getopts处理文件转换
现在用所学知识将t r- c a s e脚本转换为g e t o p t s版本。命令行选项g e t o p t s方法与s h i f t方法的唯
一区别是一个V E R B O S E选项。
变量V E R B O S E缺省取值为n o,但选择了命令行选项后, c a s e语句将捕获它,并将其设为
y e s,反馈的命令是一个简单的i f语句。
如果正在使用其他系统命令包,它总是反馈用户动作,只需简单地将包含错误的输出重
定向到/ d e v / n u l l中即可。如:
命令>/dev/null 2 >&1
缺省时V E R B O S E关闭(即不显示),使用- v选项可将其打开。例如要用V E R B O S E将
m y f i l e文件系列转换为小写,方法如下:
tr-case -l -v myfile1 myfile2 ...
或者
tr-case -v -l myfile1 myfile2 ...
可能首先注意的是使用g e t o p t s后脚本的缩减效果。这里用于文件处理的脚本与s h i f t版本
相同。
脚本如下:
第20章向脚本传递参数233
下载
在脚本中指定命令行选项时,最好使其命名规则与U N I X或L I N U X一致。下面是一些选项
及其含义的列表。
234 第四部分基础s h e l l编程
下载
选项含义
- a 扩展
- c 计数、拷贝
- d 目录、设备
- e 执行
- f 文件名、强制
- h 帮助
- i 忽略状态
- l 注册文件
- o 完整输出
- q 退出
- p 路径
-v 显示方式或版本
20.3 小结
正确控制命令行选项会使脚本更加专业化,对于用户来说会使之看起来像一个系统命令。
本章讲到了控制命令行选项的两种方法, s h i f t和g e t o p t s。使用g e t o p t s检测脚本的数量远远小
于使用s h i f t方法检测脚本的数量。
s h i f t也克服了脚本参数$ 1 . . $ 9的限制。使用s h i f t命令,脚本可以很容易偏移至所有调用参
数,因此脚本可以做进一步处理。

使用道具 举报

回复
论坛徽章:
49
NBA季后赛之星
日期:2014-10-19 19:51:33蓝锆石
日期:2014-10-19 19:51:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33指数菠菜纪念章
日期:2014-10-19 19:52:33问答徽章
日期:2014-04-15 10:41:44优秀写手
日期:2014-07-24 06:00:11保时捷
日期:2014-10-19 19:51:33三菱
日期:2014-10-19 19:51:33
160#
 楼主| 发表于 2006-8-13 19:20 | 只看该作者
第21章创建屏幕输出
用户可以使用s h e l l脚本创建交互性的、专业性强的屏幕输出。要实现这一点,系统上需
要一个彩色监视器和t p u t命令。
本章内容有:
• tput命令。
• 使用转义序列和产生控制码。
• 使用颜色。
作者写这本书时,遇到了t p u t命令的三种不同变形。至今为止最好的是GNU tput,如果没
有这个版本,首先下载它并安装在你的系统里。t p u t使用文件/ e t c / t e r m i n f o或/ e t c / t e r m c a p,这
样就可以在脚本中使用终端支持的大部分命令了。
虽然t p u t不识别颜色设置,但是可以使用控制字符实现这一点。
21.1 tput
在使用t p u t前,需要在脚本或命令行中使用t p u t命令初始化终端。
$ tput init
t p u t产生三种不同的输出:字符型、数字型和布尔型(真/假)。以下分别介绍其使用功
能。
21.1.1 字符串输出
下面是大部分常用字符串:
名字含义
b e l 警铃
b l i n k 闪烁模式
b o l d 粗体
c i v i s 隐藏光标
c l e a r 清屏
c n o r m 不隐藏光标
c u p 移动光标到屏幕位置( x,y)
e l 清除到行尾
e l l 清除到行首
s m s o 启动突出模式
r m s o 停止突出模式
s m u l 开始下划线模式
r m u l 结束下划线模式
s c 保存当前光标位置
rc 恢复光标到最后保存位置
s g r 0 正常屏幕
r e v 逆转视图
21.1.2 数字输出
以下是大部分常用数字输出。
名字含义
c o l s 列数目
i t t a b设置宽度
l i n e s 屏幕行数
21.1.3 布尔输出
在t p u t中只有两种布尔操作符。
名字含义
c h t s 光标不可见
h s 具有状态行
21.2 tput用法
上面讲过了可能用到的t p u t的大多数常用名。现在学习在一段脚本中使用t p u t。
21.2.1 设置tput命令
可以取得所有t p u t名字输出,将其保存为更有意义的变量名

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表