如何在shell中处理异常(转)
似乎好像大概有句话是这么说得,好程序与坏程序之间的区别就在于它的鲁棒性,也就是在异常情况下该程序是否还是在可hold住状态,能否不死,不崩溃,或者不做出一些超出预期的事情。那要做好这些,自然而然就要学会如何去处理异常。平时写php或者java程序等等的时候,很多人都会去注重对于异常的处理,比如try..catch等等,但往往在写一些脚本的时候,忽视了对于异常的判断。本文主要就是写如何在shell中去处理异常。因为今天太晚了,所以我就先写第一部分,后面再写第二部分。
返回值
要判断一段代码是否出现了异常,一个最基本的判断就是对他返回值的判断。在shell中,我们往往规定0为正常,一切非0返回值则为不正常。但往往我们在写shell脚本的时候,忽略对于返回值的判断。我们看一个很基本的shell程序
#!/bin/sh
cd /home/xxxx/
rm -rf * 这个脚本的意思很简单,就是cd到某一个目录下,然后将该目录下所有的内容都删除。首先,rm这种东西出现在脚本中,就是一个很危险的操作,而这个程序的关键之处还在于,并没有对第一行shell的返回值进行任何的判断,也就是说对于cd那行代码无论执行失败与否,都会去执行下面的那段rm,试想如果在某些情况下cd那段代码失败了之后,会出现多么可怕的后果。所以,我们应该对于cd的代码做返回值的判断。
#!/bin/sh
cd /home/xxxx/
if [ "$?"= "0" ]; then
rm -rf *
else
echo "cannot change directory" 1>&2
exit 1
fi $?这个常量代表的就是上一段shell的返回值。这个我在前面一片文章里也提到过shell中的trap和expr。这样写的话,就要比先前的程序安全多了,如果没有cd到相应目录,则不会去执行删除操作。
当然,程序里这样写是有些负责了,其实你也可以这样写:
if cd /home/xxxx/ ; then
rm -rf *
else
echo "cannot change directory" 1>&2
exit 1 这是if的另一种用法。这样写,就要比刚才的好多了。不过其实这样写,也比较麻烦,其实你还可以这样来写:
cd /home/xxxx/ && rm -rf * 这个&&符大家肯定不陌生,那这样来写,是否就可以保证了程序的安全性了呢?下面就来讲一下&&和||
&&和||
对于一个shell程序, shell1 && shell2 ,如果是用&&符连接的,那只有在shell1返回0(即正常)时,shell2才会执行,否则shell2根本就不执行,所以前面说得最后一种cd&&rm的这种做法是可行的,而且是安全的。那||呢,对于shell1||shell2,只有在shell1执行失败时,shell2才会执行,否则shell2是不执行得。所以,我们可以这样来写:
cd /home/xxxx || error_exit "Cannot change directory"
rm -rf * 这样,在cd /home/xxxx失败时,就会进行error_exit这个函数的分支。那error_exit这个是啥函数呢。。哦,其实,这只是一个自定义的失败处理函数而已。一个比较简单的定义,当然,这也是处理程序异常的一个方式。因为总不能每次异常,都去手动写个echo failed exit等等,所以有个统一的函数处理会比较方便。
function error_exit {
echo "$1" 1>&2
exit 1
} cd /home/xxxx || error_exit "failed"
rm -rf * 如上,这是一个非常简单的异常处理函数,在异常时,可以去主动调用error_exit,当然,你调用的时候,可以补充上行号信息。比如:
cd /home/xxxx || error_exit "$LINENO: failed" 上面讲得只是一些简单的异常处理的方式,其实还有其他方式,比如我在上篇文章shell中的trap和expr讲到的trap方式,其实也正是因为我上面文章写了trap,所以才想写这篇文章来把处理shell的异常给整理出来,当然也是为大家提个醒,在shell中,也是要处理异常,需要有这样一个意识。今天太晚了,先睡觉了,明早还要早起T.T ,下篇文章,PART 2中,我会详细总结下trap的捕获异常的方式。
转载,仅供参考,祝你愉快,满意请采纳。
如何在shell中处理异常(转)的更多相关文章
- linux如何在shell中自动生成1到100的数组
之前自己在写shell脚本的时候,需要自动创建1-100的文本确不知道该如何去创建.百度一翻终于知道了创建的方法. 在shell脚本中创建1-100的方法很多,那我在这里主要就说两种容易理解且方便的方 ...
- 如何在shell中打印出带颜色的字符?
先看如下的效果: 方法: 先看如下的脚本sh3.sh: #!/bin/bash echo "peng" echo "$(color bold yellow) ------ ...
- 如何在Shell中快速切换目录
1.回到上一次进入的路经cd -2.回到Homecd ~3.自动补齐实例,cd /usr/src/redhat,可以用cd /u[TAB]s[TAB]r[TAB]4.!$ 表示上一个命令的最后一个参数 ...
- shell中读写mysql数据库
本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...
- linux shell中读写操作mysql数据库
本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...
- bcb 如何在DLL中捕捉系统级异常
http://topic.csdn.net/t/20031023/09/2385627.html -------------------------------------------------- ...
- 如何在shell脚本中导出数组供子进程使用
功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删除环境变量 ...
- linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)(转)
tips: ============================= IFS - LINUX字段分隔符,内部字段分隔符 IFS(Internal Field Seperator)在Linux的she ...
- 深度分析如何在Hadoop中控制Map的数量
深度分析如何在Hadoop中控制Map的数量 guibin.beijing@gmail.com 很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数 ...
随机推荐
- 【CloudFoundry】架构、设计参考
参考资料: Cloud Foundry:http://baike.baidu.com/link?url=eIfPiUI8UlsqwnnSmmZ-WFyzrf38P33lJae4Hipsd0ynwXZp ...
- 警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导致栈溢出
上一篇随笔中提到了,rapidxml在每个xml对象中维护了一个内存池,自己管理变量的生存周期.看起来很好,但我们在实际使用中还是出现了问题. 项目中我们的模块很快写好了,在windows和linux ...
- 子系统设计和FishiGUI的子系统设计
目的和问题: 除了依赖关系.还要规范操作系统适配层的全部接口.仅仅要操作系统适配层的接口在移植过程中始终保持稳定.框架层的设计和实现就不会收到影响.可是为了实现同一接口的目标,为了保证相同的功能接口能 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-T_AmsNetID是什么
该参数是包含六个数字类似于IP地址的字符串形式,例如"1.1.1.2.7.1",如果为空字符串,则默认使用本机的AmsNetID 你可以右击贝福的图标,然后点击About查看当前本 ...
- Android设置拍照或者上传本地图片
效果例如以下: 看代码: MainActivity类中: package com.example.ceshidemo; import java.io.ByteArrayOutputStream; im ...
- PHP正则表达式教程
1.入门简介 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 很可能你使用过Windo ...
- Linux 查看CPU个数和磁盘个数
top后按数字1,多个cpu的话会显示多个 fdisk -l可以看到多个物理硬盘,做了硬raid只能看到一个硬盘 cat /proc/cpuinfo查看cpu具体的信息
- MySql(零):Linux(CentOS7)下安装和配置MySQL5.7.20(安装包安装)
一.下载安装包 1.在官网下载MySQL5.7安装包 mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz. 下载地址:https://dev.mysql.com/do ...
- Xilinx_7_Series_GTX简介
Xilinx_7_Series_GTX简介 https://wenku.baidu.com/view/4639cde7bb68a98270fefab6.html
- [转]实用教程:搭建FTP服务器以实现局域网飞速传输文件
原文地址:https://www.ithome.com/html/win10/304059.htm 相信很多人都面临过这样的问题:一个局域网下有很多设备,我们想在这些设备之间互传文件,有些文件非常大, ...