|
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函数调用方式 |
|