1、异常退出

  • ${0}:获取当前脚本的名称
  • $?:获取函数返回值或者上一个命令的退出状态
  • set -x:开启debug调试功能

按照目前个人理解,异常分为以下几种情况:

  1. 程序处理的异常退出

    程序员判断,当前分支不满足条件,已经不需要继续向下执行
  2. 中断异常,不可预知的异常

    这种异常一般是程序员不可预料的,包含命令本省执行错误等一下低级错误。
  3. 执行成功

    这种一般是脚本按照程序员的逻辑顺利执行完成。

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 异常处理的更多相关文章

  1. Linux入门篇(六)——Shell(二)

    这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...

  2. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  3. Linux shell编程02 shell程序的执行 及文件权限

    第一个shell脚本 1.       shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2.       ...

  4. Linux入门篇(五)——Shell(一)

    这一系列的Linux入门都是本人在<鸟哥的Linux私房菜>的基础上总结的基本内容,主要是记录下自己的学习过程,也方便大家简要的了解 Linux Distribution是Ubuntu而不 ...

  5. shell编程01—shell基础

    01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...

  6. Linux shell编程 4 ---- shell中的循环

    1 for循环 1 for语句的结构 for variable in values; do statement done 2 for循环通常是用来处理一组值,这组值可以是任意的字符串的集合 3 for ...

  7. Linux基础篇二:Bash shell(壳,命令解释器)介绍

    shell执行方式: 第一:输入命令  (简单工作) 第二:   脚本  (适合大量工作) Bash shell 实际上的叫法是  GNU/Bash    如何查询呢:  bash - version ...

  8. 【Shell编程】Shell基本语法

    Shell 语法   Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...

  9. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  10. 【shell】shell编程(六)-shell函数的应用

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...

随机推荐

  1. 开源微服务运行时 Dapr 发布 1.0 版本

    简介: Dapr 是 2019 年 10 月开源的分布式运行时.早在 Dapr 开源初期,阿里云就开始参与 Dapr 社区建设和代码开发,目前已有两位 Dapr 成员,是 Dapr 项目中除微软之外代 ...

  2. 阿里 & 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

    ​简介:经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性.高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源. ​ 作者 | ...

  3. 服务网格 ASM 年终总结:最终用户如何使用服务网格?

    ​简介:本文不打算回顾 Istio 或是阿里云服务网格 ASM 的变化或趋势,我们来聊一聊阿里云 ASM 服务网格,它的最终用户是如何使用服务网格的. 作者:叶剑宏 背景 阿里云服务网格 ASM 于 ...

  4. [FE] 关于网页的一些反爬手段的解析思路,比如 58 等

    这里主要是贴一些资料,有兴趣的可以再深入研究,比如做一些自动化库. www.cnblogs.com/TRHX/p/11740616.html blog.csdn.net/DzzzzzZzzzz/art ...

  5. dotnet 6 命令行 cmd 设置输出英文解决中文乱码

    我遇到在部署 CI 服务器,执行 cmd 命令构建,输出的中文是乱码.我期望让 dotnet 命令行输出使用英文解决乱码问题.通过设置 dotnet 命令行的语言文化,即可解决此问题 给 dotnet ...

  6. K8s控制器---Replicaset(7)

    一.Replicaset(目前少用了) 1.1 控制器管理pod 什么是控制器?前面我们学习了 Pod,那我们在定义 pod 资源时,可以直接创建一个 kind:Pod 类型的自主式 pod,但是这存 ...

  7. GeoHash实现附近的人功能(如微信附近的人、共享单车附近的车辆、美团附近的商家)

    如何查找当前点(118.818747°E,32.074497°N)附近500米的人? 这一类功能很常见(如微信附近的人.共享单车附近的车辆.美团附近的商家),那在java中是如何实 现的呢? 1 实现 ...

  8. C++指针与引用(Pointers OR References)

    一.Pointers Pointer是指针,可以用来指向任何一个objects,包括一般变量: 1 int i = 3; 2 int * pi = &i; 3 cout << pi ...

  9. 【图形数据集】CIFAR-10 dataset数据集

    文献引用:https://www.cs.toronto.edu/~kriz/cifar.html The CIFAR-10 dataset The CIFAR-10 dataset consists ...

  10. 源码安装expect

    1. yum安装expect 如果有外网,可以yum安装,如下: yum install expect 2.源码安装expect 下载tcl源码包 cd /tmp &&wget htt ...