电脑帮手
柔彩主题三 · 更轻盈的阅读体验

Shell脚本调试不抓瞎:几个实用命令和技巧

发布时间:2026-04-18 12:30:46 阅读:9 次

写完一个 Shell 脚本,一运行就报错,但错误信息只说 line 12: syntax error,连哪行写错了都看不清?别急,Linux 自带的调试工具比你想象中好用得多。

先让脚本‘开口说话’

最简单粗暴的办法:加 -x 参数运行脚本,它会把每条执行的命令原样打出来:

bash -x ./deploy.sh

比如你写了 cp $SRC $DST,而变量没赋值,终端就会显示:
+ cp '' '/opt/app',一眼就能看出 $SRC 是空的。

边跑边查变量,像在 IDE 里打断点

在脚本关键位置插入这行,就能随时打印变量内容:

echo "DEBUG: SRC=$SRC, DST=$DST" >&2

注意用 >&2 把输出送到 stderr,避免和正常输出混在一起。配合 set -u(遇到未定义变量就报错),能提前揪出拼写错误,比如把 $USER_NAME 写成 $USERNAME

快速验证语法有没有硬伤

别等运行时报错,用 -n 参数只检查语法,不执行:

bash -n ./backup.sh

返回空白就说明语法基本过关;如果有问题,会直接指出哪一行缺了 fi 或括号不匹配。

遇到管道和重定向,别被绕晕

比如这条命令老出错:grep 'error' /var/log/syslog | head -5 > result.txt。想看中间结果?拆开跑:

grep 'error' /var/log/syslog > tmp.log
head -5 tmp.log

或者用 tee 留个影:grep 'error' /var/log/syslog | tee grep_out.log | head -5 > result.txt

小技巧:临时禁用某段代码

不想删代码又怕影响逻辑?用 :(空命令)快速注释整块:

if [ -f /tmp/lock ]; then
: <<'COMMENT'
echo "跳过清理步骤"
rm -f /tmp/cache/*
COMMENT
fi

这样既保留原逻辑结构,又不会执行,改完再删掉 :COMMENT 块就行。