不使用set -e,因为遇到错误我们还需要执行一些动作,而不是直接退出exit脚本。
每个动作结束后,使用函数handle_action进行处理。
handle_action功能
- 打印动作描述
- 打印动作状态码
- 打印标准错误
- 决定是否继续执行(可加判断语句,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}"