设为首页 收藏本站
查看: 956|回复: 0

关于shell中的trap和expr

[复制链接]

尚未签到

发表于 2015-4-29 07:48:48 | 显示全部楼层 |阅读模式
  本文来自于我的博客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脚本中的异常捕获及处理非常有用。
  各位可以到这个链接看下,这个链接讲得还不错
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的时候这个命令真得很有用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61668-1-1.html 上篇帖子: 简单的shell多进程 (后台运行方式) 下篇帖子: Shell脚本语法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表