Linux扩展篇-shell编程(九)-shell 异常处理
1、异常退出
- ${0}:获取当前脚本的名称
- $?:获取函数返回值或者上一个命令的退出状态
- set -x:开启debug调试功能
按照目前个人理解,异常分为以下几种情况:
- 程序处理的异常退出
程序员判断,当前分支不满足条件,已经不需要继续向下执行 - 中断异常,不可预知的异常
这种异常一般是程序员不可预料的,包含命令本省执行错误等一下低级错误。 - 执行成功
这种一般是脚本按照程序员的逻辑顺利执行完成。
exception.sh脚本逻辑如下,使用时通过source方式加载到要执行的脚本中,可以选择性开启或关闭异常退出机制,详细讲解看下面的test.sh中的样例。
定义变量execption=-1、默认是-1表示中断退出或者执行成功的状态,0表示程序员主动退出的状态。
#!/bin/bash
#############################################
# 程序名:exception.sh
# 功能简介:shell异常处理
# 作者:cavan
# 日期:2023/3/20
# 修改说明:
#############################################
# 开启异常退出。当任何一行的命令执行错误,直接退出,不继续往下执行
function open_err_exit() {
set -e
}
# 关闭异常退出。当任何一行的命令执行错误,继续往下执行
function close_err_exit() {
set +e
}
# 处理退出的方法
function _exit() {
exit_code=$?
if [ "A${exception}" != 0 ]; then
if [ "A${exit_code}" != "A0" ]; then
_fail
else
_success
fi
fi
}
# 处理失败的方法
function _fail() {
exception=0
echo "脚本${0}执行异常中断,程序运行终止!"
exit 1
}
# 处理成功的方法
function _success() {
echo "脚本${0}执行成功,程序运行成功!"
}
# 程序开始的方法
function _start() {
echo "脚本${0}开始执行。。。"
}
########### Main ##############
# exception=0 表示程序处理的异常退出
# exception=-1 表示中断异常或执行成功
exception=-1
# 捕获异常退出动作
trap _exit EXIT
# 开始执行脚本
_start
##################### END OF PROCEDURE ###############
测试开启异常退出,测试脚本:
#!/bin/bash
set -x
source ./exception.sh
# 开启异常退出
open_err_exit
# 查看一个不存在的文件
cat /home/cavan/hello.txt
echo "忽略报错,继续执行"
程序执行结果如下,开启异常退出后,脚本执行结果失败,echo "忽略报错,继续执行"不会被执行
+ source ./exception.sh
++ exception=-1
++ trap _exit EXIT
++ _start
++ echo 脚本./test.sh开始执行。。。
脚本./test.sh开始执行。。。
+ open_err_exit
+ set -e
+ cat /home/cavan/hello.txt
cat: /home/cavan/hello.txt: No such file or directory
+ _exit
+ is_exec_succ=1
+ '[' A-1 '!=' 0 ']'
+ '[' A1 '!=' A0 ']'
+ _fail
+ exception=0
+ echo 脚本./test.sh执行异常中断,程序运行终止!
脚本./test.sh执行异常中断,程序运行终止!
+ exit 1
测试关闭异常退出,测试脚本:
#!/bin/bash
set -x
source ./exception.sh
# 开启异常退出
close_err_exit
# 查看一个不存在的文件
cat /home/cavan/hello.txt
echo "忽略报错,继续执行"
程序执行结果如下,开启异常退出后,脚本执行结果失败,echo "忽略报错,继续执行"会执行
+ source ./exception.sh
++ exception=-1
++ trap _exit EXIT
++ _start
++ echo 脚本./test.sh开始执行。。。
脚本./test.sh开始执行。。。
+ close_err_exit
+ set +e
+ cat /home/cavan/hello.txt
cat: /home/cavan/hello.txt: No such file or directory
+ echo 忽略报错,继续执行
忽略报错,继续执行
+ _exit
+ is_exec_succ=0
+ '[' A-1 '!=' 0 ']'
+ '[' A0 '!=' A0 ']'
+ _success
+ echo 脚本./test.sh执行成功,程序运行成功!
脚本./test.sh执行成功,程序运行成功!
2、异常退出,清除敏感变量
定义一个数组变量,用于保存要清理的敏感变量名称,当脚本中产生敏感变量时,例如token,password等信息时,通过need_delete_params+=("password"),将变量password添加到清理数组中,当执行_exit时,如果数组的大小大于0,则执行清理动作。
#!/bin/bash
#############################################
# 程序名:exception.sh
# 功能简介:shell异常处理
# 作者:cavan
# 日期:2023/3/20
# 修改说明:
#############################################
# 定义数组,保存需要清理的变量名称
need_delete_params=()
# 开启异常退出。当任何一行的命令执行错误,直接退出,不继续往下执行
function open_err_exit() {
set -e
}
# 关闭异常退出。当任何一行的命令执行错误,继续往下执行
function close_err_exit() {
set +e
}
# 处理退出的方法
function _exit() {
exit_code=$?
if [ "A${exception}" != 0 ]; then
if [ "A${exit_code}" != "A0" ]; then
_fail
else
_success
fi
fi
# 清空敏感变量,need_delete_params为数组,如果数组长度大于0,就进行清理
if [ ${#need_delete_params[@]} -gt 0 ]; then
echo "start to delete sensitive information"
# 对数组去重,避免重复清理
need_delete_params=($(awk -v RS=' ' '!a[$1]++' <<<${need_delete_params[@]}))
del_param ${need_delete_params[@]}
else
echo "no need to delete sensitive information"
fi
}
# 清理敏感变量
function del_param() {
# 循环清除变量
params=$*
for param_name in ${params[@]}; do
echo "delete param ${param_name}. "
eval $param_name=$(eval echo '$'{"${param_name}"'//?/0}')
unset ${param_name}
done
}
# 处理失败的方法
function _fail() {
exception=0
echo "脚本${0}执行异常中断,程序运行终止!"
exit 1
}
# 处理成功的方法
function _success() {
echo "脚本${0}执行成功,程序运行成功!"
}
# 程序开始的方法
function _start() {
echo "脚本${0}开始执行。。。"
}
########### Main ##############
# exception=0 表示程序处理的异常退出
# exception=-1 表示中断异常或执行成功
exception=-1
# 捕获异常退出动作
trap _exit EXIT
# 开始执行脚本
_start
##################### END OF PROCEDURE ###############
Linux扩展篇-shell编程(九)-shell 异常处理的更多相关文章
- Linux入门篇(六)——Shell(二)
这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...
- 【Shell编程】Shell程序设计
1.Shell简介 作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统. Sh ...
- Linux shell编程02 shell程序的执行 及文件权限
第一个shell脚本 1. shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2. ...
- Linux入门篇(五)——Shell(一)
这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...
- shell编程01—shell基础
01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...
- Linux shell编程 4 ---- shell中的循环
1 for循环 1 for语句的结构 for variable in values; do statement done 2 for循环通常是用来处理一组值,这组值可以是任意的字符串的集合 3 for ...
- Linux基础篇二:Bash shell(壳,命令解释器)介绍
shell执行方式: 第一:输入命令 (简单工作) 第二: 脚本 (适合大量工作) Bash shell 实际上的叫法是 GNU/Bash 如何查询呢: bash - version ...
- 【Shell编程】Shell基本语法
Shell 语法 Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...
- shell编程===执行shell脚本的四种方法
使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...
- 【shell】shell编程(六)-shell函数的应用
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...
随机推荐
- Oracle邮件发送(内容中带有收件人独有信息)
Oracle邮件发送(内容中带有收件人独有信息) Oracle邮件发送(内容中带有收件人独有信息) Oracle发送邮件最简单的应该就是用smtp,具体使用和参数讲解我这儿没有 简单来说,发送邮件的思 ...
- 力扣564(java)-寻找最近的回文数(困难)
题目: 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身).如果不止一个,返回较小的那个. "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: n = ...
- BladeDISC 0.2.0更新发布
简介:在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优化与功能增强. 在BladeDISC正式开源三个月后,我们发布了0.2.0版本,该更新包含了大量的性能优 ...
- Gartner APM 魔力象限技术解读——全量存储? No! 按需存储?YES!
简介: 在云原生时代,充分利用边缘节点的计算和存储能力,结合冷热数据分离实现高性价比的数据价值探索已经逐渐成为 APM 领域的主流. 作者:夏明(涯海) 调用链记录了完整的请求状态及流转信息,是一座巨 ...
- 钉钉宜搭亮相“第二届ISIG中国产业智能大会”:云钉低代码,构建企业酷应用
简介:低代码年度行业盛会!钉钉宜搭创始人叶周全受邀出席并发表主题演讲. 12月8日,由中国电子技术标准化研究院指导,RPA中国.LowCode低码时代.信创中国联合举办的"第二届ISIG中 ...
- 从改一个老项目开始的PHP踩坑记
php所有版本的地址: https://windows.php.net/downloads/releases/archives/ 访问控制器时省略了index.php报No input file sp ...
- vue监听watch
export default { watch:{ showArea(val,_val){ console.log('showAre ...
- Oracle、达梦:☆获取数据库对象、获取对象的DDL定义语句(达梦)
一.获取数据库对象(Oracle.达梦) 以下方式在达梦DM数据库中都能跑通,Oracle未测试所有的方式. 1.获取所有对象--所有模式下的 数据库所有对象表:包括表.视图.物化视图.函数.存储过程 ...
- SAP Adobe Form 教程六 FormCalc和JavaScript的实践
前文: SAP Adobe Form 教程一 简单示例 SAP Adobe Form 教程二 表 SAP Adobe Form 教程三 日期,时间,floating field SAP Adobe F ...
- 利用python爬取某壳的房产数据
以无锡的某壳为例进行数据爬取,现在房子的价格起伏很快,买房是人生一个大事,了解本地的房价走势来判断是否应该入手. (建议是近2年不买,本人在21年高位抛了一套房,基本是通过贝壳数据判断房价已经到顶,希 ...