Shell 异常处理

原创:转载请注明出处 

#!/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 方法处理了。

如果理解有误,请评论区留言,欢迎指正。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值