本文来自于我的博客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的时候这个命令真得很有用。