原创:转载请注明出处
#!/bin/bash
##################服务器执行以下脚本#############################
## 重新上传脚本到服务器 -> 部署启动的脚本
#当任何一行的命令执行错误的时候(比如命令写错了)直接退出,不继续往下执行
function openErrexit {
set -e
}
#当任何一行的命令执行错误的时候,继续往下执行,不如你没有安装java,
#但是你执行了java -version,此时会继续往下执行,不会因为错误停止
function closeErrexit {
set +e
}
# 处理退出的方法
function _exit {
#执行成功的标记
is_exec_succ=$?
if [ "A$execption" != 0 ]
then
if [ "A$is_exec_succ" != "A0" ]
then
echo "脚本执行异常中断,程序运行终止!"
exit 1
else
_success
fi
fi
}
# 处理失败的方法
function _fail {
execption=0
echo "程序员处理失败的逻辑。"
exit 1
}
# 处理成功的方法
function _success {
echo "脚本执行成功..."
echo 0
}
# 处理开始的方法
function _start {
echo "脚本开始执行..."
}
#execption=0 表示程序处理的异常退出
#execption=-1 表示中断异常或执行成功
execption=-1
# 捕获退出的动作
trap _exit EXIT
_start
echo "helloworld"
一、我的理解是首先将脚本执行的结果分为三种情况
1、程序处理的异常退出
程序员判断,当前分支不满足条件,已经不需要继续向下执行
2、中断异常,不可预知的异常
这种异常一般是程序员不可预料的,包含命令本省执行错误等一下低级错误。
3、执行成功
这种一般是脚本按照程序员的逻辑顺利执行完成。
二、我的理解是把中断异常处理又分为两类
1、出现错误继续执行
这种情况一般是怎么样的呢,比如说我现在服务器没安装java环境,但是我执行了java -version命令,这种情况下我是要继续执行的,为什么呢,因为我要根据我java -version的返回值来判断当前环境是不是安装了java环境,如果没有安装我就安装,如果安装了,那我就做我其他的事情。
2、出现错误终止执行
这种情况一般是怎么样的呢,比如说我写了mkdir -p java, 然后又echo "aa" >> java,后面我还echo "脚本执行成功" exit 0,那显然不能这样。可能我举的例子不太恰当,想说明的是只要我脚本中有一行命令执行的返回值不为真,那么就中断脚本,停止继续向下运行。
三、如何才能达到这样的效果
定义变量execption=-1、默认是-1表示中断退出或者执行成功的状态,0表示程序员主动退出的状态。
当你想通过错误来判断你服务是否存在的时候,可以关闭,表示从下面一行开始之后的命令,当执行错误的时候,可以忽略继续向下执行。当你执行java -version时
此时你可以通过$?来判断是不是安装了java环境,那为什么要关闭呢?因为你加了捕获EXIT的处理方法,如果你不关闭set +e,那么就会被捕获EXIT,然后被
处理掉,程序到这儿就算结束了。
这个判断结束之后,可以通过调用 set -e开启,那么下面只要执行错误,都会EXIT,并且被_EXIT处理。如果是这样,那么就需要判断一下到底是执行完成正常退出,还是说错误退出呢,卡检查一下最后一行的返回值就行了,并且要是execption!=0 之后判断,execption==0说明程序员已经处理过了,不需要_EXIT 方法处理了。
如果理解有误,请评论区留言,欢迎指正。