电脑学堂
第二套高阶模板 · 更大气的阅读体验

终端窗口调试bash脚本的实用技巧

发布时间:2026-01-14 14:51:18 阅读:212 次

在日常使用Linux或macOS系统时,很多人会写一些bash脚本来自动化处理文件备份、日志清理或者软件部署任务。可一旦脚本运行出错,光看输出结果往往摸不着头脑。这时候,在终端窗口调试bash脚本就成了绕不开的一环。

开启脚本执行回显:用 -x 参数

最直接的办法是让bash把每一步执行的命令都打印出来。比如你有个叫 backup.sh 的脚本,可以直接这样运行:

bash -x backup.sh

加上 -x 后,终端会逐行显示实际执行的命令,变量也会被展开。比如原本是 cp $FILE /backup/,可能显示成 cp document.txt /backup/,一眼就能看出变量有没有正确赋值。

在脚本内部启用调试模式

如果不想每次手动加 -x,可以在脚本开头的 shebang 下面加一行:

set -x

这会让从这一行开始的所有命令都自动回显。想关闭的时候再写 set +x 就行了。适合只调试脚本中间某一段逻辑的情况。

检查语法但不执行

有时候脚本还没跑就报错,可能是语法问题。可以用 -n 参数让bash只读取不执行:

bash -n backup.sh

如果有漏掉的引号、括号不匹配或者语法错误,这里就会提示出来,省得等到运行时才发现。

结合 echo 定位问题

别小看最原始的 echo 大法。在关键步骤前后打个标记,能快速判断脚本是否执行到某一行:

echo "[DEBUG] 正在进入循环,当前文件: $file"

特别是处理批量文件时,加上时间戳更清楚:

echo "$(date) - 开始压缩 $filename"

捕捉信号与临时文件清理

有些脚本会生成临时文件,中途出错没删干净就很烦。可以用 trap 捕获中断信号,在退出前做清理:

TEMP_DIR=/tmp/myapp.tmp
mktemp -d $TEMP_DIR
	rap 'rm -rf $TEMP_DIR' EXIT

这样即使你 Ctrl+C 中断脚本,临时目录也会被自动删除,不会越积越多。

模拟执行:用 echo 代替危险操作

修改系统配置或删除文件前,先确认逻辑正确很重要。可以把 rm、mv 这类命令暂时替换成 echo:

# rm -f $logfile
echo "[WOULD REMOVE] $logfile"

等确认输出没问题,再切回真实命令,避免误删重要数据。

利用返回值排查故障

每个命令执行完都会有一个退出状态,0 表示成功,非0代表出错。可以用 $? 立刻查看上一条命令的结果:

cp file.txt /backup/
echo "复制命令返回值: $?"

配合 if 判断,可以针对性处理失败情况:

if ! ping -c1 google.com > /dev/null 2>&1; then
    echo "网络不通,跳过上传"
fi