关于shell中的trap和expr

来源:互联网 发布:dv是什么意思网络语言 编辑:程序博客网 时间:2024/05/29 13:02

本文来自于我的博客http://www.log4myself.info/archives/318

前言

实在不知道这个文章名应怎么写了,就随便写了这么一个奇怪的名字。反正就是来讲trap和expr。trap和expr是shell中的两个命令,后面那个命令大家应该都很熟,就是进行四则运算的,而前面那个命令可能不写shell脚本的人不太熟。这个我下面会讲到它的简单作用。

但看到这里,或许大家还是在奇怪我为什么要写这两个命令,就是说为什么这两个命令会联系在一起,哎,这主要在于我工作时写脚本时遇到的一个问题。使这俩本来看起来互不相干的命令联系在了一起。

首先讲一下trap这个命令是干什么用得。

trap

trap是写shell脚本的利器,通常用trap来处理shell中的各种异常,类似于catch(try..catch)。那在讲trap命令是干什么的之前,先讲下他的语法,trap的语法是这样的:

trap [COMMANDS] [SIGNALS]

这个语法的意思就死活说,trap会捕获在[SIGNALS]的信号,在捕获到信号后,会执行COMMANDS命令。比如说,你可以让trap捕获SIGHUP信号,在捕获到相应信号时,执行你写的command命令。trap非常有用,不过我一般不用他捕获信号,而是捕获ERR,这个ERR,就是指所有非0返回值的shell命令的执行。因为在shell的规范中,正确执行命令后,shell的返回值都应该是0,非0的即是没有正确执行得。所以,捕获所以非0返回的,就是对所有shell中未成功执行得进行相应的处理。比如,你可以这样写:

trap echo failed ERR

这个命令就是在写当遇到任何错误时,会直接执行到这一句,直接echo failed。当然你可以完善的更好些,比如把错误行号打印出来,这些就看你自由发挥的。所以,trap这个命令对于shell脚本中的异常捕获及处理非常有用。

各位可以到这个链接看下,这个链接讲得还不错<a href="http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html" title="http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html" target="_blank"></a>

expr

好,讲完了trap,那我就来讲讲expr,其实expr没什么好讲的,就是个四则运算的,这个我把命令贴出来大家就清楚了:

$ expr 1 / 1
1

这命令就是在计算1除以1等于几的问题。好,既然是这么一个简单的命令,那又是与trap怎么关系起来的呢。我们看下面一条命令:

$ expr 1 / 2
0

这个计算1除以2,因为expr只能搞整形的计算,所以等于0,也没什么问题,这个命令看起来没任何问题,因为1除以2,确实等于0,但问题就在于这个命令的返回值。我们可以看下

caojiandong@naruto. ~/
$ expr 1 / 2
0
caojiandong@naruto. ~/
$ echo $?
1

大家可以看到,这个命令的返回值是1,而正常运行的命令返回值应该是0的。比如:

caojiandong@naruto. ~/
$ expr 3 / 2
1
caojiandong@naruto. ~/
$ echo $?
0

至于为什么1/2,expr的返回值是1,这个我还没仔细研究,因为目测结果是没问题的,这个各位童鞋如果知道的话也劳烦指教下。

说到这里,大家应该清楚了为什么expr会和trap给联系在了一起,就是这个返回值。我在写脚本的时候,就是执行了一个结果为0的expr,目测是没问题的,结果他的返回值为1,所以就被trap给catch住了,结果就抛异常了。。。靠,expr 1/2 这种,除数大于被除数的,结果是0的,返回值为什么要是1呢。。。。

nnd,后来定位了后,我就没再用expr了,直接用$(())来给变量赋值了。

好了,文章写完了,没啥技术含量,不过不知道trap的可以去了解下,因为写shell的时候这个命令真得很有用。


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击