shell函数和调试命令

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

上面一行脚本指出,选项ahfv可以不加实际值进行传递,而选项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 XL 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

移动光标到屏幕位置(xy

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 rw h i l eu n t i lc 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 iset 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      24shell嵌入命令

5.1      shell嵌入命令完整列表

标准的嵌入命令

命令符号

含义

空,永远返回为true

.

从当前shell中执行操作

break

退出forwhileuntil、或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打印命令名是否有效及该命令在系统

的位置。例如:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值