1. Bash调试的必要性与挑战
作为一名长期与Bash打交道的开发者,我见过太多因为脚本调试不到位而引发的"血案"。从服务器批量操作失误到生产环境数据丢失,这些事故往往源于一些本可以通过简单调试手段发现的低级错误。Bash作为Unix/Linux系统的默认shell,其脚本通常承担着系统管理、自动化部署等关键任务,调试技能的缺失可能带来灾难性后果。
Bash调试的特殊性在于它的动态性和灵活性。与编译型语言不同,Bash脚本是逐行解释执行的,这导致:
- 语法错误可能直到运行时才暴露
- 变量作用域和类型转换常常出人意料
- 管道和子shell的行为不符合直觉
- 环境依赖问题在特定条件下才会触发
最近遇到的一个典型案例:某团队使用脚本批量更新云服务器时,因为未处理-u选项(未定义变量报错),导致脚本静默跳过关键步骤,最终300台服务器配置不一致。这正是缺乏系统调试知识导致的典型问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础调试工具与技巧
2.1 调试选项组合拳
Bash内置了一系列调试选项,合理组合使用能解决80%的常见问题:
bash复制#!/bin/bash -xe
# 或者运行时启用
set -xe
-
-x(xtrace):打印每个命令及其参数(带+前缀),是调试流程控制的利器。建议在复杂脚本中全程启用,你会惊讶地发现实际执行路径与预期常有差异。 -
-e(errexit):任何命令返回非零状态时立即退出。防止错误累积酿成大祸,特别是在rm -rf $DIR这类危险操作前。 -
-u(nounset):使用未定义变量时报错退出。避免变量名拼写错误导致的逻辑错误,这是最常见的脚本缺陷来源。 -
-o pipefail:管道中任意命令失败则整个管道失败。默认行为是仅以最后一个命令的返回值作为管道结果,这经常掩盖真实错误。
经验:生产环境脚本建议至少使用
set -euo pipefail组合,这能捕获大多数初级错误。调试时可再加上-x。
2.2 精准调试控制
对于大型脚本,全局启用-x会产生大量输出。更精细的控制方式是使用trap和DEBUG信号:
bash复制trap 'echo "LINE $LINENO: $BASH_COMMAND"' DEBUG
这段代码会在每个命令执行前打印行号和命令内容。你还可以扩展这个技巧:
bash复制debug() {
echo "DEBUG at ${BASH_SOURCE[0]}:$1 - ${FUNCNAME[1]}()" >&2
}
trap 'debug $LINENO' DEBUG
这能显示文件名、行号和函数名,特别适合模块化脚本的调试。
3. 高级调试场景实战
3.1 管道与子shell陷阱
管道和子shell是Bash调试的"重灾区"。看这个典型例子:
bash复制count=$(find . -name "*.log" | wc -l)
echo "Found $count logs"
当没有日志文件时,wc -l仍然会输出0,掩盖了find可能存在的权限问题。正确的调试姿势:
bash复制set -o pipefail
tempfile=$(mktemp)
find . -name "*.log" > "$tempfile" || {
echo "Find failed with status $?" >&2
exit 1
}
count=$(wc -l < "$tempfile")
3.2 数组与引用的微妙之处
Bash的数组和引用处理常常出人意料:
bash复制files=("a.txt" "b.txt")
for file in ${files[@]}; do
rm "$file" # 如果文件名包含空格会出问题!
done
正确的调试版本应该:
bash复制set -x
files=("a b.txt" "c.txt") # 测试带空格的文件名
for file in "${files[@]}"; do
[[ -f "$file" ]] || {
echo "File not found: $file" >&2
continue
}
rm -v "$file"
done
注意这里使用了-v参数让rm打印操作详情,这是调试文件操作的实用技巧。
4. 专业调试工具链
4.1 Bashdb - 专业的Bash调试器
对于复杂脚本,可以安装bashdb(Bash Debugger):
bash复制# Ubuntu/Debian
sudo apt install bashdb
# CentOS/RHEL
sudo yum install bashdb
使用示例:
bash复制bashdb --debug your_script.sh
调试器支持:
- 断点设置(break)
- 单步执行(step/next)
- 变量检查(print)
- 调用栈查看(backtrace)
4.2 VS Code集成调试
现代IDE如VS Code通过插件提供Bash调试支持:
- 安装Bash Debug插件
- 创建
.vscode/launch.json:
json复制{
"version": "0.2.0",
"configurations": [
{
"type": "bashdb",
"request": "launch",
"name": "Debug Script",
"program": "${file}"
}
]
}
优势:
- 可视化断点管理
- 鼠标悬停查看变量值
- 集成交互式终端
4.3 静态分析工具
预防胜于治疗,这些工具能在运行前发现问题:
-
shellcheck:最流行的Bash静态分析工具bash复制# 安装 sudo apt install shellcheck # 使用 shellcheck script.sh -
bashate:检查代码风格 -
checkbashisms:检测非POSIX兼容语法
5. 生产环境调试技巧
5.1 安全日志记录
生产环境调试必须考虑安全性,避免泄露敏感信息:
bash复制log_debug() {
[[ "$DEBUG" ]] || return 0
local msg="$1"
# 过滤密码等敏感信息
msg=${msg//$PASSWORD/[REDACTED]}
logger -t "script_debug" "$msg"
}
# 使用
DEBUG=1 log_debug "Connecting to database with $USER:$PASSWORD"
5.2 远程调试技巧
当需要在服务器上调试时:
-
使用
script命令记录完整会话:bash复制script debug_session.log bash -x problematic_script.sh exit -
对于无交互环境,可以重定向调试输出:
bash复制exec 5> debug.log BASH_XTRACEFD="5" bash -x script.sh
5.3 性能调试
使用time和xtrace结合分析性能瓶颈:
bash复制PS4='+ $EPOCHREALTIME ' bash -x slow_script.sh
这会为每个命令添加时间戳,方便定位耗时操作。
6. 常见错误与解决方案
6.1 坏的解释器错误
热词中出现的-bash: ./create_lv.sh: /bin/bash^m: 坏的解释器是典型的Windows换行符问题。解决方案:
bash复制# 方法1:转换行尾
dos2unix create_lv.sh
# 方法2:使用sed清理
sed -i 's/\r$//' create_lv.sh
# 方法3:在vim中
:set ff=unix
6.2 权限问题
-bash: docker-ce.repo: permission denied这类错误通常有三种解决路径:
-
使用正确权限执行:
bash复制sudo bash script.sh -
修改文件权限:
bash复制chmod +x script.sh -
检查SELinux上下文:
bash复制ls -Z script.sh chcon -t bin_t script.sh
6.3 版本兼容问题
如sdkman requires bash 4 or higher这类问题,升级Bash的方法:
bash复制# MacOS
brew install bash
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
chsh -s /usr/local/bin/bash
# Ubuntu
sudo apt update && sudo apt install --only-upgrade bash
# CentOS
sudo yum install -y epel-release
sudo yum update bash
验证版本:
bash复制bash --version
7. 调试框架与最佳实践
7.1 模块化调试技巧
对于大型脚本项目,建议采用模块化调试方法:
bash复制#!/bin/bash
# 加载调试库
source debug_lib.sh
# 主函数
main() {
init_check
process_data
cleanup
}
# 单独调试模块
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
debug::start_trace
main "$@"
debug::end_trace
fi
其中debug_lib.sh可以包含:
bash复制debug::start_trace() {
exec 5> debug.log
BASH_XTRACEFD="5"
PS4='+ [$(date "+%T")] ${BASH_SOURCE}:${LINENO} ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
set -x
}
debug::log() {
[[ "$DEBUG" ]] || return
echo "[DEBUG] $*" >&2
}
7.2 单元测试方法
为关键函数编写测试用例:
bash复制test_add() {
result=$(add 2 3)
[[ "$result" -eq 5 ]] || {
echo "FAIL: add 2 3 expected 5, got $result" >&2
return 1
}
}
add() {
echo $(($1 + $2))
}
# 运行测试
test_add && echo "Test passed" || echo "Test failed"
更完善的方案是使用bats(Bash Automated Testing System):
bash复制# 安装
sudo apt install bats
# 测试文件
@test "addition using bc" {
result="$(echo 2+2 | bc)"
[ "$result" -eq 4 ]
}
7.3 CI/CD集成
在持续集成中自动检查脚本:
yaml复制# .gitlab-ci.yml示例
shellcheck:
image: koalaman/shellcheck-alpine
script:
- shellcheck *.sh
bats:
image: bats/bats
script:
- bats tests/
8. 调试思维与工作流
8.1 科学调试方法论
- 重现问题:确定能稳定复现问题的最小案例
- 二分排查:通过注释代码块快速定位问题区域
- 假设验证:对可能原因提出假设并设计测试验证
- 根因分析:不仅修复表面现象,更要理解深层原因
- 防御编码:针对发现的问题增加预防措施
8.2 我的调试工作流
经过多年实践,我总结出以下高效调试流程:
- 首先运行
shellcheck进行静态分析 - 在关键位置插入
set -x和set +x限定调试范围 - 对复杂数据结构使用
declare -p var打印完整内容 - 使用
trap 'echo "Error on line $LINENO"' ERR捕获错误位置 - 最终验证时使用干净环境:
bash复制env -i bash --noprofile --norc script.sh
8.3 调试日志的艺术
好的调试日志应该:
- 包含时间戳和上下文信息
- 区分不同日志级别(DEBUG, INFO, ERROR)
- 支持动态日志级别控制
- 避免敏感信息泄露
实现示例:
bash复制#!/bin/bash
LOG_LEVEL=${LOG_LEVEL:-INFO}
log() {
local level=$1
shift
local msg="$*"
local timestamp=$(date "+%Y-%m-%d %T")
declare -A levels=([DEBUG]=0 [INFO]=1 [WARN]=2 [ERROR]=3)
[[ ${levels[$level]} ]] || return 1
(( ${levels[$level]} < ${levels[$LOG_LEVEL]} )) && return 0
echo "[$timestamp] [$level] ${BASH_SOURCE[1]}:${BASH_LINENO[0]} - $msg" >&2
}
# 使用示例
log DEBUG "Starting processing"
log INFO "Found $(wc -l < file) lines"
log ERROR "Invalid input detected"
9. 性能调试进阶
9.1 性能分析工具
-
time:测量命令执行时间bash复制time bash script.sh -
strace:跟踪系统调用bash复制
strace -f -o trace.log bash script.sh -
perf:Linux性能分析器bash复制perf stat bash script.sh
9.2 优化技巧
-
减少子shell使用:
bash复制# 慢 count=$(grep -c pattern file) # 快 grep -c pattern file > tmpfile read count < tmpfile -
使用内置字符串操作替代外部命令:
bash复制# 避免 trimmed=$(echo "$var" | sed 's/^ *//') # 推荐 trimmed=${var#"${var%%[![:space:]]*}"} -
批量操作替代循环:
bash复制# 慢 for file in *.txt; do process "$file" done # 快 find . -name '*.txt' -exec process {} +
10. 跨平台调试策略
10.1 处理平台差异
编写可移植脚本时:
bash复制#!/bin/bash
# 检测操作系统
case "$(uname -s)" in
Linux*) machine=Linux;;
Darwin*) machine=Mac;;
CYGWIN*) machine=Cygwin;;
MINGW*) machine=MinGw;;
*) machine="UNKNOWN"
esac
# 平台特定处理
if [[ "$machine" == "Mac" ]]; then
alias md5sum=md5
fi
# 路径处理
path=$(realpath --relative-to="$PWD" "$file" 2>/dev/null || {
# 回退方案
python -c "import os.path; print(os.path.relpath('$file'))"
})
10.2 容器化调试
使用Docker创建一致的调试环境:
bash复制# Dockerfile
FROM ubuntu:latest
RUN apt update && apt install -y bash bashdb shellcheck
WORKDIR /scripts
COPY . .
# 构建并运行
docker build -t bash-debug .
docker run -it --rm bash-debug bash -x script.sh
10.3 版本控制集成
在Git预提交钩子中添加检查:
bash复制#!/bin/bash
# .git/hooks/pre-commit
# 静态检查
shellcheck $(git diff --cached --name-only --diff-filter=d | grep '\.sh$')
# 测试运行
bats tests/
11. 调试复杂管道
11.1 管道调试技巧
-
逐步构建管道:
bash复制# 初始 cat file # 添加步骤 cat file | grep pattern # 继续扩展 cat file | grep pattern | sort -
使用
tee检查中间结果:bash复制cat file | tee raw.txt | grep pattern | tee filtered.txt | sort -
管道状态检查:
bash复制set -o pipefail cmd1 | cmd2 | cmd3 echo "Pipeline status: ${PIPESTATUS[@]}"
11.2 进程替换妙用
替代临时文件的优雅方案:
bash复制# 传统方式
cmd1 > temp1
cmd2 > temp2
diff temp1 temp2
# 现代方式
diff <(cmd1) <(cmd2)
调试时可以这样检查:
bash复制# 查看进程替换内容
cat <(cmd1)
12. 信号处理调试
12.1 捕获信号调试
bash复制trap 'echo "Received SIGINT"; exit 1' INT
trap 'echo "Script exited with status $?"' EXIT
12.2 超时处理
bash复制timeout=5
(
sleep 10
echo "Done"
) & pid=$!
(
sleep $timeout
kill -TERM $pid 2>/dev/null
) & watchdog=$!
if wait $pid; then
echo "Completed"
else
echo "Timed out"
fi
kill $watchdog 2>/dev/null
13. 调试资源管理
13.1 文件描述符泄漏检测
bash复制# 显示当前进程打开的文件
ls -l /proc/$$/fd
# 调试时关闭无关描述符
exec 3>&- 4>&-
13.2 内存使用监控
bash复制# 监控脚本内存
while true; do
ps -p $$ -o %mem,rss
sleep 1
done
14. 调试网络相关脚本
14.1 网络请求调试
bash复制# 详细输出
curl -v http://example.com
# 调试TLS
openssl s_client -connect example.com:443 -showcerts
# 模拟慢速连接
curl --limit-rate 10K http://example.com
14.2 端口占用检测
bash复制# 检查端口
nc -zv localhost 8080 || echo "Port 8080 is free"
# 调试端口冲突
lsof -i :8080
15. 调试并发脚本
15.1 竞态条件检测
bash复制set -o monitor
wait
# 或者在关键区域加锁
(
flock -n 9 || exit 1
# 临界区代码
) 9>/var/lock/myscript.lock
15.2 并行任务控制
bash复制max_jobs=4
for item in {1..10}; do
((++running >= max_jobs)) && wait -n
(
process "$item"
) &
done
wait
16. 调试用户输入处理
16.1 交互式输入调试
bash复制read -p "Enter value: " -e -i "default" value
echo "Debug: Got [$value]"
# 记录完整会话
script replay.log
16.2 输入验证
bash复制while true; do
read -p "Enter number (1-100): " num
[[ "$num" =~ ^[0-9]+$ ]] || continue
(( num >= 1 && num <= 100 )) && break
echo "Invalid input" >&2
done
17. 调试环境依赖问题
17.1 环境隔离测试
bash复制# 最小环境测试
env -i PATH=/bin:/usr/bin bash --noprofile --norc script.sh
# 容器测试
docker run --rm -v "$PWD:/scripts" bash:latest bash script.sh
17.2 依赖检查
bash复制check_deps() {
local deps=("curl" "jq" "awk")
for dep in "${deps[@]}"; do
if ! command -v "$dep" >/dev/null; then
echo "Missing dependency: $dep" >&2
return 1
fi
done
}
18. 调试国际化脚本
18.1 字符编码处理
bash复制# 检测文件编码
file -i script.sh
# 转换编码
iconv -f ISO-8859-1 -t UTF-8 script.sh > script.utf8.sh
18.2 本地化调试
bash复制# 强制特定语言环境
LANG=C bash script.sh
# 调试日期解析
LC_TIME=en_US.UTF-8 date -d "March 1"
19. 调试安全相关脚本
19.1 权限检查
bash复制# 检查运行权限
[[ $(id -u) -eq 0 ]] || { echo "Requires root" >&2; exit 1; }
# 安全目录操作
mkdir -p -- "$dir" || exit 1
19.2 敏感信息处理
bash复制# 安全变量清理
unset password
shred -u .credentials
20. 调试自动化部署脚本
20.1 幂等性检查
bash复制# 确保操作可重复执行
if [[ ! -f "/installed" ]]; then
apt install -y package
touch /installed
fi
20.2 回滚机制
bash复制# 备份原始状态
backup_dir=$(mktemp -d)
cp -a /etc/nginx/ "$backup_dir"
# 失败时恢复
trap 'cp -a "$backup_dir"/* /etc/nginx/' ERR
21. 调试cron作业
21.1 环境变量问题
bash复制# 在cron中设置完整环境
* * * * * . ~/.profile; /path/to/script.sh
21.2 日志记录
bash复制# 重定向所有输出
* * * * * /path/to/script.sh >> /var/log/script.log 2>&1
22. 调试系统启动脚本
22.1 引导顺序问题
bash复制# 添加调试输出
echo "$(date) - Starting service" >> /var/log/boot.log
22.2 依赖服务检查
bash复制# 等待数据库就绪
while ! nc -z db 3306; do
sleep 1
done
23. 调试交互式脚本
23.1 终端检测
bash复制# 检查是否在终端运行
[[ -t 0 ]] && echo "Interactive" || echo "Non-interactive"
23.2 颜色输出控制
bash复制# 仅当终端支持颜色时启用
if [[ -t 1 ]]; then
RED='\033[0;31m'
NC='\033[0m'
else
RED='' NC=''
fi
echo -e "${RED}Error${NC}"
24. 调试数据处理脚本
24.1 数据抽样检查
bash复制# 检查前N行
head -n 100 bigfile.csv | analyze.sh
# 随机抽样
shuf -n 1000 bigfile.csv | analyze.sh
24.2 数据一致性验证
bash复制# 生成校验和
checksum=$(sha256sum data.txt | cut -d' ' -f1)
# 传输后验证
[[ "$(sha256sum received.txt | cut -d' ' -f1)" == "$checksum" ]] || exit 1
25. 调试硬件相关脚本
25.1 设备检测
bash复制# USB设备调试
lsusb -v | grep -i "mydevice"
# 内核消息查看
dmesg | grep -i "usb"
25.2 性能监控
bash复制# CPU温度监控
sensors | grep "Core 0"
# 磁盘I/O调试
iostat -x 1
26. 调试图形界面脚本
26.1 X11调试
bash复制# 显示环境变量
env | grep -E 'DISPLAY|XAUTHORITY'
# 虚拟帧缓冲测试
xvfb-run script.sh
26.2 自动化工具调试
bash复制# 记录xdotool操作
xdotool getmouselocation --shell
27. 调试多媒体处理脚本
27.1 FFmpeg调试
bash复制# 详细输出
ffmpeg -v debug -i input.mp4 output.avi
# 检查媒体信息
ffprobe -show_streams input.mp4
27.2 图像处理调试
bash复制# 验证图像属性
identify -verbose image.jpg | grep -i "width\|height"
28. 调试文本处理脚本
28.1 正则表达式调试
bash复制# 逐步测试正则
grep -E 'pattern' file
echo $?
# 使用pcretest交互测试
pcretest
28.2 复杂awk脚本调试
bash复制# 打印行号和原始内容
awk '{print NR, $0}' file
# 调试模式
awk --debug -f script.awk file
29. 调试系统管理脚本
29.1 服务管理调试
bash复制# 详细服务状态
systemctl status --no-pager -l service
# 查看启动日志
journalctl -u service -n 100
29.2 用户权限调试
bash复制# 检查有效权限
sudo -u www-data whoami
# 模拟用户环境
su - username -c "env"
30. 调试Web相关脚本
30.1 CGI调试
bash复制# 命令行测试CGI
REQUEST_METHOD="GET" QUERY_STRING="param=value" ./script.cgi
30.2 API测试
bash复制# 使用curl测试
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://api
31. 调试数据库脚本
31.1 SQL调试
bash复制# 启用SQL日志
mysql -e "SET GLOBAL general_log = 'ON'; SET GLOBAL log_output = 'TABLE';"
# 查看执行语句
SELECT * FROM mysql.general_log;
31.2 事务测试
bash复制# 测试回滚
(
echo "BEGIN;"
echo "INSERT INTO table VALUES(1);"
echo "SELECT * FROM table;"
echo "ROLLBACK;"
) | mysql db
32. 调试加密相关脚本
32.1 OpenSSL调试
bash复制# 详细输出
openssl s_client -connect host:443 -state -debug
# 证书验证
openssl verify -CAfile ca.crt cert.pem
32.2 GPG调试
bash复制# 详细输出
gpg --debug-all --sign file.txt
# 密钥列表
gpg --list-keys --keyid-format LONG
33. 调试打包部署脚本
33.1 RPM构建调试
bash复制# 详细构建输出
rpmbuild -vv -ba specfile.spec
# 安装测试
rpm -ivh --test package.rpm
33.2 Docker构建调试
bash复制# 保留中间容器
docker build --progress=plain --no-cache .
# 进入失败环节
docker run -it failed_image /bin/bash
34. 调试测试框架脚本
34.1 Bats扩展调试
bash复制# 详细输出
bats --tap --print-output-on-failure test.bats
# 单测调试
bats --filter "test name" test.bats
34.2 覆盖率检测
bash复制# 使用bashcov
bashcov -- bash script.sh
35. 调试性能测试脚本
35.1 基准测试
bash复制# 时间测量
time for i in {1..100}; do ./script.sh; done
# 性能统计
perf stat -r 10 ./script.sh
35.2 压力测试
bash复制# 并发测试
seq 1 100 | xargs -P 10 -I {} ./script.sh {}
36. 调试文档生成脚本
36.1 Markdown校验
bash复制# 检查死链
markdown-link-check README.md
# 语法检查
markdownlint README.md
36.2 文档构建调试
bash复制# 详细输出
make -n docs # 空运行
make SHELL='bash -x' docs # 调试模式
37. 调试持续集成脚本
37.1 本地CI测试
bash复制# 使用act测试GitHub Actions
act -j build
# 使用gitlab-runner本地测试
gitlab-runner exec docker job_name
37.2 环境变量验证
bash复制# 打印所有CI变量
env | grep -E 'CI|GITLAB|GITHUB'
38. 调试容器编排脚本
38.1 Kubernetes调试
bash复制# 详细描述资源
kubectl describe pod pod-name
# 容器日志
kubectl logs -f pod-name -c container-name
38.2 Docker Compose调试
bash复制# 详细输出
docker-compose --verbose up
# 进入服务容器
docker-compose exec service bash
39. 调试基础设施脚本
39.1 Terraform调试
bash复制# 详细输出
TF_LOG=DEBUG terraform apply
# 执行计划检查
terraform plan -out=plan.out
terraform show -json plan.out | jq
39.2 Ansible调试
bash复制# 详细输出
ANSIBLE_DEBUG=1 ansible-playbook playbook.yml
# 任务标签调试
ansible-playbook --tags "setup" playbook.yml
40. 调试机器学习脚本
40.1 数据流水线调试
bash复制# 检查数据样本
head -n 1 dataset.csv | jq
# 验证数据统计
csvstat dataset.csv
40.2 训练过程监控
bash复制# 实时日志
tail -f training.log | grep -i "accuracy"
# 资源使用
nvidia-smi -l 1
41. 调试科学计算脚本
41.1 数值精度问题
bash复制# 高精度计算
bc -l <<< "scale=10; 1/3"
# 浮点比较
awk 'BEGIN {printf "%.15f\n", 0.1+0.2}'
41.2 矩阵运算验证
bash复制# 使用octave验证
octave --eval "A=[1 2;3 4]; B=[5 6;7 8]; A*B"
42. 调试生物信息脚本
42.1 FASTQ处理调试
bash复制# 检查质量分数
head -n 4 sample.fastq | awk 'NR%4==0'
# 验证序列长度
awk 'NR%4==2 {print length($0)}' sample.fastq | sort | uniq -c
42.2 BAM文件调试
bash复制# 查看头部信息
samtools view -H sample.bam
# 统计比对情况
samtools flagstat sample.bam
43. 调试地理信息脚本
43.1 GDAL调试
bash复制# 查看栅格信息
gdalinfo image.tif
# 检查投影
gdalsrsinfo image.tif
43.2 空间查询验证
bash复制# 使用ogrinfo测试
ogrinfo -sql "SELECT COUNT(*) FROM layer" file.shp
44. 调试金融分析脚本
44.1 时间序列验证
bash复制# 检查日期连续性
awk '{print $1}' prices.csv | uniq | wc -l
44.2 数值一致性检查
bash复制# 验证余额
awk 'BEGIN {sum=0} {sum+=$2} END {print sum}' transactions.txt
45. 调试日志分析脚本
45.1 日志模式测试
bash复制# 测试正则匹配
grep -E "$pattern" sample.log | head
45.2 时间范围提取
bash复制# 提取特定时段日志
awk -v from="2023-01-01" -v to="2023-01-02" \
'$1" "$2 >= from && $1" "$2 <= to' server.log
46. 调试安全审计脚本
46.1 登录审计
bash复制# 检查失败登录
grep "Failed password" /var/log/auth.log | awk '{print $1,$2,$3,$9}'
46.2 文件变更监控
bash复制# 查找最近修改的文件
find /etc -type f -mtime -1 -ls
47. 调试备份恢复脚本
47.1 备份验证
bash复制# 测试tar归档
tar -tf backup.tar | head
# 检查rsync结果
rsync -n -av --delete src/ dest/
47.2 恢复测试
bash复制# 空运行恢复
bash -n restore.sh
# 使用测试数据
TEST_MODE=1 ./restore.sh
48. 调试邮件处理脚本
48.1 SMTP调试
bash复制# 手动SMTP测试
nc -C localhost 25 <<EOF
EHLO example.com
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
Subject: Test
This is a test
.
QUIT
EOF
48.2 邮件内容检查
bash复制# 查看原始邮件
cat /var/mail/user | less
49. 调试API网关脚本
49.1 请求重放
bash复制# 使用jq处理JSON日志
jq -r '.request' api.log | while read -r req; do
curl -X "$(jq -r '.method' <<<"$req")" \
-d "$(jq -r '.body' <<<"$req")" \
"$(jq -r '.url' <<<"$req")"
done
49.2 流量镜像
bash复制# 使用tee分流
tee >(process_request.sh) | forward_to_prod.sh
50. 调试物联网设备脚本
50.1 传感器数据验证
bash复制# 模拟数据输入
socat -u /dev/zero /dev/ttyUSB0,raw,echo=0
# 检查原始输出
cat /dev/ttyUSB0 | hexdump -C
50.2 设备状态监控
bash复制# 轮询设备状态
while true; do
echo -e "STATUS\n" > /dev/ttyACM0
sleep 1
done
51. 调试区块链相关脚本
51.1 智能合约测试
bash复制# 本地测试网络
ganache-cli --debug
# 交易调试
truffle debug <txHash
