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. 【笔记】Oracle Offset 以及力扣

    [笔记]Oracle Offset offset 代表跳过前 n 行,如果表少于 n+1 条记录,结果集将是空的:比如 n = 100,表示从 101 开始往后查. fetch next 代表往后查 ...

  2. 剑指offer04(Java)二维数组中的查找(中等)

    题目: 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有 ...

  3. 性能透明提升 50%!SMC + ERDMA 云上超大规模高性能网络协议栈

    简介: 新的协议栈是不是重新发明轮子?一个协议栈能否解决所有问题?适配所有场景? 编者按:当前内核网络协议栈有什么问题?新的协议栈是不是重新发明轮子?一个协议栈能否解决所有问题?适配所有场景?本文整理 ...

  4. 可观测告警运维系统调研——SLS告警与多款方案对比

    简介: 本文介绍对比多款告警监控运维平台方案,覆盖阿里云SLS.Azure.AWS.自建系统(ELK.Prometheus.TICK)等方案. 前言 本篇是SLS新版告警系列宣传与培训的第三篇,后续我 ...

  5. 龙蜥利器:系统运维工具 SysAK的云上应用性能诊断 | 龙蜥技术

    ​简介:本文从大量的性能诊断实践出发,来介绍 SysAK 在性能诊断上的方法论及相关工具. ​ 文/张毅:系统运维SIG核心成员.SysAK 项目负责人:毛文安:系统运维 SIG 负责人. 系统运维既 ...

  6. [Go] godoc 打开本地文档, windows 同样适用

    godoc 提供了在无网环境下 浏览官方文档的便利. 示例: $ go get golang.org/x/tools/cmd/godoc $ godoc -http=localhost:6060 Li ...

  7. dotnet 6 使用 Obfuscar 进行代码混淆

    本文来安利大家 Obfuscar 这个好用的基于 MIT 协议开源的混淆工具.这是一个非常老牌的混淆工具,从 2014 年就对外分发,如今已有累计 495.5K 的 nuget 下载量.而且此工具也在 ...

  8. linux应用程序开发入门

    在上一篇文章中学习了linux字符驱动的开发,需要使用应用程序对完成的驱动进行验证,现在开始学习应用程序的开发. 一.准备材料 开发环境:VMware 操作系统:ubuntu 开发版:湃兔i2S-6U ...

  9. Winform程序使用app.minifest清单禁止高DPI无法失效问题

    问题:Winform程序使用app.minifest清单禁止高DPI无法失效问题 摘要:因为笔记本基本都会有DPI放大,所以目前程序需要嵌入清单,并将其高DPI支持给禁止掉. 环境搭建:Winform ...

  10. 推荐一款轻量级堡垒机系统让你防护“rm -rf 删库跑路”

    大家好,我是 Java陈序员. 我们在开发工作中,会经常与服务器打交道,而服务器的资源又是十分宝贵,特别是服务器里面的数据资源. 但是,偶尔会经常因为疏忽而导致服务器数据资源丢失,给自己和公司带来巨大 ...