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打印命令名是否有效及该命令在系统
的位置。例如: