SHELL - 控制流模板

原创
2023/02/20 19:19
阅读数 28

不使用set -e,因为遇到错误我们还需要执行一些动作,而不是直接退出exit脚本。

每个动作结束后,使用函数handle_action进行处理。

handle_action功能

  1. 打印动作描述
  2. 打印动作状态码
  3. 打印标准错误
  4. 决定是否继续执行(可加判断语句,exit ${action_exit_code})
# set -e

WORK_DIR=$(cd $(dirname "${BASH_SOURCE:=-$0}") && pwd)
SCRIPT_NAME=$(basename $0 .sh)
DATE_TAG=$(date '+%Y%m%d')
TMP_DIR="${WORK_DIR}/tmp/${SCRIPT_NAME}-${DATE_TAG}"
LOG_DIR="${WORK_DIR}/log"

if [ -d "${LOG_DIR}" ]; then
  LOG_FILE="${LOG_DIR}/${SCRIPT_NAME}-${DATE_TAG}.log"
else
  mkdir -p ${LOG_DIR}
  chmod 775 ${LOG_DIR}
  LOG_FILE="${LOG_DIR}/${SCRIPT_NAME}-${DATE_TAG}.log"
fi

# 定义清理函数
function cleanup {
  rm -rf "$TMP_DIR"
  logger info "Deleted temp working directory $TMP_DIR"
}


# 退出时执行清理函数
trap cleanup EXIT

# 定义工作函数

function handle_action() {
  action_exit_code=$1
  action_message="$2"
  if [ ${action_exit_code} -eq 0 ]; then
    logger info "<Success> ${action_message}"
  else
    logger erro "<Fail> ${action_message}"
    logger erro "<Status> ${action_exit_code}"
    logger erro "<Output> ${STD_ERROR}"
    exit ${action_exit_code}
  fi
}

function logger() {
  if [ $# -eq 2 ]; then
    echo "$(date +'%Y%m%d %T') [${1^^}] : $2" 2>&1 | tee -a $LOG_FILE
  else
    echo "Usage: ${FUNCNAME[0]} log_level message"
  fi
}

# main

STEP_MSG="#10 Create temperay work directory"
mkdir -p ${TMP_DIR} && chmod 777 ${TMP_DIR} && chmod 777 ${WORK_DIR}/tmp
STATUS=$?
handle_action $STATUS "${STEP_MSG}"

STEP_MSG="#11 chmod LOG_FILE"
chmod 777 ${LOG_FILE}
STATUS=$?
handle_action $STATUS "${STEP_MSG}"

STEP_MSG="#20 list nofolder"
STD_ERROR=$(ls -l nofolder 2>&1)
STATUS=$?
handle_action $STATUS "${STEP_MSG}"

STEP_MSG="#21 gcloud config list"
STD_ERROR=$(gcloud config list 2>&1)
STATUS=$?
handle_action $STATUS "${STEP_MSG}"

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部