本文目录导读:

我来介绍几种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 逻辑"
最佳实践建议
- 不要在生产环境启用调试模式
- 使用环境变量控制调试(如
export DEBUG=true) - 调试信息输出到日志文件而非标准输出
- 包含时间戳和行号信息
- 使用颜色区分调试输出
#!/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脚本的调试功能。