Shell脚本如何实现调试模式

wen 实用脚本 1

本文目录导读:

Shell脚本如何实现调试模式

  1. 使用bash调试选项
  2. 实现自定义调试函数
  3. 创建调试模式开关
  4. 高级调试技巧
  5. 调试模式配置文件
  6. 条件调试
  7. 最佳实践建议

我来介绍几种Shell脚本实现调试模式的常用方法:

使用bash调试选项

命令行参数

bash -x script.sh

脚本内部启用(在脚本开头添加)

#!/bin/bash
set -x  # 开启调试模式
# 你的脚本内容
set +x  # 关闭调试模式

实现自定义调试函数

#!/bin/bash
# 调试开关
DEBUG=false
# 自定义调试函数
debug() {
    if [ "$DEBUG" = true ]; then
        echo "[DEBUG] $(date '+%Y-%m-%d %H:%M:%S') - $1"
    fi
}
# 详细调试函数,显示变量值
debug_var() {
    if [ "$DEBUG" = true ]; then
        local var_name=$1
        local var_value=$2
        echo "[DEBUG] $var_name = $var_value (Line: ${BASH_LINENO[0]})"
    fi
}
# 使用示例
echo "正常输出"
debug "这是调试信息"
debug_var "USER" "$USER"

创建调试模式开关

#!/bin/bash
# 检查命令行参数是否包含-d或--debug
for arg in "$@"; do
    case "$arg" in
        -d|--debug)
            DEBUG_MODE=true
            set -x  # 自动开启bash调试
            ;;
        *)
            ;;
    esac
done
if [ "$DEBUG_MODE" = true ]; then
    echo "运行在调试模式..."
fi
# 你的脚本逻辑
echo "脚本执行中..."

高级调试技巧

1 追踪函数调用

#!/bin/bash
trace() {
    local depth=${#FUNCNAME[@]}
    local indent=""
    for ((i=0; i<depth; i++)); do
        indent+="  "
    done
    echo "${indent}[TRACE] ${FUNCNAME[1]}() -> $1"
}
my_function() {
    trace "Entering function"
    local var="test"
    trace "Variable var = $var"
    trace "Exiting function"
}
my_function

2 日志级别系统

#!/bin/bash
# 日志级别
LOG_LEVEL=${LOG_LEVEL:-2}  # 默认INFO级别
declare -A LOG_LEVELS=(
    ["ERROR"]=1
    ["WARN"]=2
    ["INFO"]=3
    ["DEBUG"]=4
)
log() {
    local level=$1
    local message=$2
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    if [ ${LOG_LEVELS[$level]} -le $LOG_LEVEL ]; then
        echo "[$timestamp] [$level] $message"
    fi
}
# 使用示例
log "ERROR" "这是一个错误消息"
log "INFO" "这是一个信息消息"
log "DEBUG" "这是一个调试消息"  # 只在日志级别>=4时显示

调试模式配置文件

创建配置文件 debug.conf

# 调试配置文件
DEBUG=true
DEBUG_LEVEL=2
DEBUG_LOG_FILE="/tmp/script_debug.log"
DEBUG_FUNCTIONS="func1,func2"

脚本中读取配置:

#!/bin/bash
# 加载调试配置
if [ -f "debug.conf" ]; then
    source debug.conf
fi
# 根据配置设置调试
if [ "$DEBUG" = true ]; then
    exec 5>> "$DEBUG_LOG_FILE"
    BASH_XTRACEFD=5
    set -x
fi
# 脚本逻辑
echo "脚本运行中..."

条件调试

#!/bin/bash
# 条件调试函数
debug_print() {
    local condition=$1
    local message=$2
    if [ "$condition" = true ]; then
        echo "[DEBUG] $message"
    fi
}
# 针对特定部分调试
SECTION_1_DEBUG=true
SECTION_2_DEBUG=false
debug_print $SECTION_1_DEBUG "Section 1 - 正在执行..."
echo "Section 1 逻辑"
debug_print $SECTION_2_DEBUG "Section 2 - 正在执行..."
echo "Section 2 逻辑"

最佳实践建议

  1. 不要在生产环境启用调试模式
  2. 使用环境变量控制调试(如 export DEBUG=true
  3. 调试信息输出到日志文件而非标准输出
  4. 包含时间戳和行号信息
  5. 使用颜色区分调试输出
#!/bin/bash
# 带颜色的调试输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
debug_info() {
    if [ "$DEBUG" = true ]; then
        echo -e "${GREEN}[DEBUG]${NC} $1"
    fi
}
debug_warn() {
    if [ "$DEBUG" = true ]; then
        echo -e "${YELLOW}[WARN]${NC} $1"
    fi
}
debug_error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
}

这些方法可以根据实际需求组合使用,灵活实现Shell脚本的调试功能。

抱歉,评论功能暂时关闭!