1 第19章 函数
1.1 函数
函数由两部分组成:
函数标题,函数体。
标题是函数名。函数体是函数内的命令集合。标题名应该唯一;如果不是,将会混淆结
果,因为脚本在查看调用脚本前将首先搜索函数调用相应的s h e l l。
定义函数的格式为:
函数名()
{
命令1
. . .
}
如果愿意,可在函数名前加上关键字f u n c t i o n,这取决于使用者。
f u n c t i o n 函数名()
{ ...
}
可以将函数看作是脚本中的一段代码,但是有一个主要区别。执行函数时,它保留当前
s h e l l和内存信息。此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的
s h e l l,因而去除所有原脚本中定义的存在变量。
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。函数
不必包含很多语句或命令,甚至可以只包含一个e c h o语句,这取决于使用者。
1.2 向函数传递参数
向函数传递参数就像在一般脚本中使用特殊变量$ 1 , $ 2 . . . $ 9一样,函数取得所传参数后,
将原始参数传回s h e l l脚本,因此最好先在函数内重新设置变量保存所传的参数。这样如果函数有一点错误,就可以通过已经本地化的变量名迅速加以跟踪。函数里调用参数(变量)的转换以下划线开始,后加变量名,如: _ F I L E N A M E或_ f i l e n a m e。
1.3 从调用函数中返回
当函数完成处理或希望函数基于某一测试语句返回时,可做两种处理:
1) 让函数正常执行到函数末尾,然后返回脚本中调用函数的控制部分。
2) 使用r e t u r n返回脚本中函数调用的下一条语句,可以带返回值。0为无错误,1为有错误。
这是可选的,与最后状态命令报表例子极其类似。其格式为:
r e t u r n 从函数中返回,用最后状态命令决定返回值。
Return 0 无错误返回。
1.4 定位文件
定位文件格式为:
. / 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。如果仍有错误,则应该仔细检查是否键入了完整路径名。Return 1 有错误返回
1.5 执行shell函数
要执行函数,简单地键入函数名即可。这里是带有一个参数的f i n d i t函数,参数是某个系
统文件。
1.6 删除shell函数
现在对函数做一些改动。首先删除函数,使其对s h e l l不可利用。使用u n s e t命令完成此功
能。删除函数时u n s e t命令格式为:
unset function_name
$ unset findit
如果现在键入s e t命令,函数将不再显示。
1.7 定位文件不只用于函数
定位文件不只针对于函数,也包含组成配置文件的全局变量。
假定有两个备份文件备份同一系统的不同部分。最好让它们共享一个配置文件。为此需要在一个文件里创建用户变量,然后将一个备份脚本删除后,可以载入这些变量以获知用户在备份开始前是否要改变其缺省值。有时也许要备份到不同的媒体中。
2 第20章向脚本传递参数
2.1 shift命令
向脚本传递参数时,有时需要将每一个参数偏移以处理选项,这就是s h i f t命令的功能。
它每次将参数位置向左偏移一位,下面用一段简单脚本详述其功能。脚本使用w h i l e循环反馈所有传递到脚本的参数。
2.2 getopts
g e t o p t s可以编写脚本,使控制多个命令行参数更加容易。g e t o p t s用于形成命令行处理标准形式。原则上讲,脚本应具有确认带有多个选项的命令文件标准格式的能力。
2.3 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保存最后处理参数,一会儿就可以看出处理过程中这样做的好处。
2.4 使用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
2.5 linux命令参数
在脚本中指定命令行选项时,最好使其命名规则与U N I X或L I N U X一致。下面是一些选项及其含义的列表。
|
选项 |
含义 |
|
-a |
扩展 |
|
-c |
计数、拷贝 |
|
-d |
目录、设备 |
|
-e |
执行 |
|
-f |
文件名、强制 |
|
-h |
帮助 |
|
-i |
忽略状态 |
|
-l |
注册文件 |
|
-o |
完整输出 |
|
-q |
退出 |
|
-p |
路径 |
|
-v |
显示方式或版本 |
3 第21章创建屏幕输出
3.1 tput
在使用t p u t前,需要在脚本或命令行中使用t p u t命令初始化终端。
$ tput init
t p u t产生三种不同的输出:字符型、数字型和布尔型(真/假)。以下分别介绍其使用功
能。
3.2 字符串输出
下面是大部分常用字符串:
|
名字 |
含义 |
|
bel |
警铃 |
|
blink |
闪烁模式 |
|
bold |
粗体 |
|
civis |
隐藏光标 |
|
clear |
清屏 |
|
cnorm |
不隐藏光标 |
|
cup |
移动光标到屏幕位置(x,y) |
|
el |
清除行尾 |
|
ell |
清除行首 |
|
smso |
启动突出模式 |
|
rmso |
停止突出模式 |
|
smul |
开始下划线模式 |
|
rmul |
结束下划线模式 |
|
sc |
保存当前光标位置 |
|
rc |
恢复光标到最后保存位置 |
|
Sgr0 |
正常屏幕 |
|
rgv |
逆转视图 |
3.3 数字输出
以下是大部分常用数字输出。
|
名字 |
含义 |
|
cols |
列数目 |
|
it |
Tab设置宽度 |
|
lines |
屏幕行数 |
3.4 布尔输出
在t p u t中只有两种布尔操作符
|
名字 |
含义 |
|
chts |
光标不可见 |
|
hs |
具有状态行 |
3.5 使用颜色
对域使用颜色可以使数据输入屏幕看起来更加专业。下面将使用的颜色是A N S I标准颜
色,并不是所有颜色都适合于所有系统。下面列出了大部分常用颜色。
3.5.1 前景色:
|
数字 |
颜色 |
数字 |
颜色 |
|
30 |
黑色 |
34 |
蓝色 |
|
31 |
红色 |
35 |
紫色 |
|
32 |
绿色 |
36 |
青色 |
|
33 |
黄(或粽)色 |
37 |
白(或灰)色 |
3.5.2 背景色
|
数字 |
颜色 |
数字 |
颜色 |
|
40 |
黑色 |
44 |
蓝色 |
|
41 |
红色 |
45 |
紫色 |
|
42 |
绿色 |
46 |
青色 |
|
43 |
黄(或粽)色 |
47 |
白(或灰)色 |
<ESCAPE> [background_number;foreground_number m
4 第23章调试脚本
4.1 循环错误
f o r、w h i l e、u n t i l和c a s e语句中的错误是指实际语句段不正确。也许漏写了固定结构中的一个保留字。
下面错误打印信息d o n e,这是一个很好的线索。因为这时知道正在处理一个w h i l e语句。
回溯脚本段,检查w h i l e语句,是否漏写或错写了关键字,如d o或者正在使用的条件语句。
Syntax error near unexpected token ‘done’
Line 31: ‘done’
4.2 典型的漏写引号
第二个典型错误是漏写引号错误。经常要注意这个问题,因为此错误经常出现。这里给
出解决这类错误的唯一方案是在脚本中确保所有引号成对出现。
Unexpected EOF while looking for ‘”’
Line 36: syntax error
当s h e l l打印出错误行后,通常在v i编辑器中查看文件。使用v i的set nu选项调试错误,先
进入v i,然后点击< E S C >键,后跟一冒号,再键入set nu <return>,这时给出文本行号,然后进入s h e l l打印错误行。
4.3 测试错误
另一个常见错误是在使用- e q语句时忘记在测试条件一边使用数字取值。
如果得到下列错误提示,通常是由于两件事情:需要在变量和方括号间加空格;在方括
号里漏写操作符。
[ : missing ‘]’
4.4 字符大小写
经验上讲大多数错误是由于使用变量时大小写保持不一致。例如经常在开始定义时用大
写,然后在变量调用时用了小写字符,这样难免变量会没有赋值。
4.5 for循环
使用f o r循环时,有时会忘了在循环的列表部分用$符号,特别是在读取字符串时。
4.6 echo
最有用的调试脚本工具是e c h o命令。一般在可能出现问题的脚本重要部分加入e c h o命令,
例如在变量读取或修改操作其前后加入e c h o命令。
使用最后状态命令判断命令是否成功,这里需要注意的是,不要使用e c h o命令后直接加
最后状态命令,因为此命令永远为真。
4.7 set命令
s e t命令可辅助脚本调试。以下是s e t命令常用的调试选项:
set -n 读命令但并不执行。
set -v 显示读取的所有行。
set -x 显示所有命令及其参数。
将s e t选项关闭,只需用+替代-。有人总认为+应该为开,而-应为关闭,但实际刚好相反。
可以在脚本开始时将s e t选项打开,然后在结束时关闭它。或在认为有问题的特殊语句段
前后打开及关闭它。
5 第24章shell嵌入命令
5.1 shell嵌入命令完整列表
标准的嵌入命令
|
命令符号 |
含义 |
|
: |
空,永远返回为true |
|
. |
从当前shell中执行操作 |
|
break |
退出for、while、until、或case语句 |
|
cd |
改变当前目录 |
|
continue |
执行循环的下一步 |
|
echo |
反馈信息到保准输出 |
|
eval |
读取参数 |
|
exec |
执行命令,但不在当前shell |
|
exit |
退出当前shell |
|
export |
导出变量,使当前shell可利用它 |
|
pwd |
显示当前目录 |
|
read |
从标准输入读取一行文本 |
|
readonly |
使变量只读 |
|
return |
退出函数并带有返回值 |
|
set |
控制各种参数到标准输出的显示 |
|
shift |
命令行参数向左偏移一个 |
|
test |
评估条件表达式 |
|
times |
显示shell运行过程的用户和系统时间 |
|
trap |
当捕获信号时运行指定命令 |
|
ulimit |
显示或设置shell资源 |
|
umask |
显示或设置缺省文件创建模式 |
|
unset |
从shell内存中删除变量或函数 |
|
wait |
等待直到子进程运行完毕,报告终止。 |
5.2 set
在查看调试脚本、打开或关闭s h e l l选项时,曾用到s e t命令。s e t也可用于在脚本内部给出其运行参数,以下举例说明。假定有一段脚本控制两个参数,但并不向脚本传递参数而是在脚本内部设置其取值。可以用s e t命令完成此功能。
格式为:set param1 param2 ..
5.3 times
t i m e s命令给出用户脚本或任何系统命令的运行时间。第一行给出s h e l l消耗时间,第二行给出运行命令消耗的时间。下面是t i m e s命令的输出结果:
5.4 type
使用t y p e查询命令是否仍驻留系统及命令类型。t y p e打印命令名是否有效及该命令在系统
的位置。例如:

被折叠的 条评论
为什么被折叠?



