当前位置: 首页 > article >正文

【linux】shell(37)-脚本调试

1. 使用 Shell 调试选项

Shell 提供了多种调试选项,可以用于检查脚本的语法和执行过程。

1.1 -n 选项

作用:读取脚本但不执行,用于检查脚本的语法错误。

用法:

bash -n script.sh

示例:

#!/bin/bash
echo "Hello World"
echo "Missing quote

执行:

bash -n script.sh

输出:

script.sh: line 3: unexpected EOF while looking for matching `"'

1.2 -v 选项

作用:在执行脚本时,将执行的每一行命令打印到标准输出。

用法:

bash -v script.sh

示例:

#!/bin/bash
echo "This is line 1"
echo "This is line 2"

执行:

bash -v script.sh

输出:

#!/bin/bash
echo "This is line 1"
This is line 1
echo "This is line 2"
This is line 2

1.3 -x 选项

作用:提供详细的执行跟踪信息,将每条命令及其参数的展开过程输出到标准错误。

用法:

bash -x script.sh

示例:

#!/bin/bash
x=5
echo "x is $x"

执行:

bash -x script.sh

输出:

+ x=5
+ echo 'x is 5'
x is 5

2. 在脚本中启用调试模式

您可以在脚本内部使用 set 命令启用或禁用调试选项:

2.1 启用调试

set -x  # 启用 -x 选项

2.2 禁用调试

set +x  # 禁用 -x 选项

示例:

#!/bin/bash
echo "Before debugging"
set -x  # 启用调试模式
x=10
echo "x is $x"
set +x  # 禁用调试模式
echo "After debugging"

执行:

bash script.sh

输出:

Before debugging
+ x=10
+ echo 'x is 10'
x is 10
After debugging

3. 使用 trap 捕获错误

trap 命令可以捕获脚本中的错误,输出错误信息并执行指定操作。

用法:

trap 'echo "Error at line $LINENO"' ERR

示例:

#!/bin/bash
trap 'echo "Error occurred at line $LINENO"' ERR

echo "This is a test script"
cd /nonexistent_directory  # 会触发错误
echo "This line will not be executed"

执行:

bash script.sh

输出:

This is a test script
Error occurred at line 5

4. 逐行调试脚本

逐行调试可以帮助您观察脚本的执行过程。

方法: 在脚本中插入 read 命令,逐行暂停并等待用户输入。

示例:

#!/bin/bash
echo "Step 1: Initializing..."
read -p "Press Enter to continue..."
echo "Step 2: Processing..."
read -p "Press Enter to continue..."
echo "Step 3: Finished."

执行脚本时,按 Enter 键逐步执行每个步骤。


5. 输出变量值进行调试

在脚本中添加 echo 语句,可以输出变量的值来帮助定位问题。

示例:

#!/bin/bash
x=10
echo "Debug: x is $x"
y=$((x+5))
echo "Debug: y is $y"

执行:

bash script.sh

输出:

Debug: x is 10
Debug: y is 15

6. 重定向调试信息

将调试信息输出到文件,便于后续分析。

方法:

bash -x script.sh > debug.log 2>&1

说明:

  • > debug.log:将标准输出重定向到文件 debug.log

  • 2>&1:将标准错误重定向到标准输出。


7. 使用 bashdb 交互式调试工具

bashdb 是一个强大的交互式 Bash 脚本调试工具,类似于 GDB(GNU Debugger),可以帮助用户逐步执行和调试 Bash 脚本,定位脚本中的问题。


7.1 安装 bashdb

在大多数 Linux 发行版中,bashdb 可能不是默认安装的,您需要手动安装。

7.1.1 在基于 Debian 的系统上(如 Ubuntu)

sudo apt update
sudo apt install bashdb

7.1.2 在基于 Red Hat 的系统上(如 CentOS 或 RHEL)

sudo yum install bashdb

7.1.3 在 macOS 上

如果使用 Homebrew,可以通过以下命令安装:

brew install bashdb

7.1.4 验证安装

安装完成后,执行以下命令检查是否成功安装:

bashdb --version

输出示例:

bashdb, the Bash Debugger, version 5.0-1.1

7.2. 启动 bashdb

使用 bashdb 调试脚本时,您需要将脚本文件作为参数传递给 bashdb

7.2.1 基本启动命令

bashdb script.sh
  • script.sh:要调试的 Bash 脚本文件。

7.2.2 启动并传递参数

如果脚本需要参数,可以在启动时传递:

bashdb script.sh arg1 arg2

7.3. bashdb 的基本操作与命令

7.3.1 帮助命令

  • help:显示帮助菜单。

  • help <command>:查看特定命令的帮助信息。

示例:

help break

7.3.2 运行与继续执行

  • runr:从脚本的开头开始执行。

  • continuec:继续执行直到遇到断点或脚本结束。

示例:

bashdb script.sh
run

7.3.3 单步调试

  • steps:单步执行脚本,进入函数内部。

  • nextn:单步执行,但跳过函数调用。

示例:

s    # 执行下一步并进入函数
n    # 执行下一步但跳过函数

7.3.4 查看脚本代码

  • listl:显示当前行的上下文代码。

  • list <line>:显示指定行附近的代码。

示例:

l      # 显示当前行的上下文
l 20   # 显示第 20 行附近的代码

7.3.5 设置断点

  • break <line>b <line>:在指定行设置断点。

  • break <function>:在指定函数的开头设置断点。

  • info breakpoints:显示所有已设置的断点。

示例:

b 10            # 在第 10 行设置断点
b my_function   # 在 my_function 函数设置断点
info breakpoints  # 查看所有断点

7.3.6 监控变量值

  • print <variable>p <variable>:打印变量的当前值。

  • set <variable>=<value>:修改变量的值。

  • info variables:查看当前所有变量及其值。

示例:

p x       # 输出变量 x 的值
set x=10  # 将变量 x 设置为 10
info variables  # 显示所有变量

7.3.7 删除断点

  • clear <line>:删除指定行的断点。

  • delete <breakpoint>:删除指定编号的断点。

示例:

delete 1  # 删除编号为 1 的断点
clear 10  # 清除第 10 行的断点

7.3.8 执行脚本中的命令

  • eval <command>:执行脚本中的任意 Bash 命令。

  • source:重新加载脚本。

示例:

eval echo $PATH   # 执行任意命令

7.4. bashdb 调试示例

下面是一个使用 bashdb 调试的示例脚本:

示例脚本(example.sh):

#!/bin/bash
x=5
y=10
result=$((x + y))
echo "The result is: $result"

7.4.1 启动调试

bashdb example.sh

7.4.2 调试过程

(bashdb) list       # 查看代码
(bashdb) break 3    # 在第 3 行设置断点
(bashdb) run        # 执行脚本
(bashdb) print x    # 查看变量 x 的值
(bashdb) next       # 单步执行下一行
(bashdb) print result  # 查看 result 的值
(bashdb) continue   # 继续执行脚本

常用命令速查表

命令说明
run / r开始执行脚本
continue / c继续执行直到下一个断点
step / s单步执行并进入函数
next / n单步执行但跳过函数
break / b设置断点
print / p输出变量的值
list / l查看代码
info显示断点、变量等信息
delete删除断点

http://www.kler.cn/a/440935.html

相关文章:

  • Scala-异常
  • 网络安全、Web安全、渗透测试之笔经面经总结(二)
  • 鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现
  • QT TCP(socket)编程-服务器与客户端IP地址问题
  • 在 SQL Server 中获取指定字符所在有位置索引
  • stm32-- 存储-flash和ram
  • Hadoop概述
  • Linux实操篇-远程登录/Vim/开机重启
  • 【超详细实操内容】django的身份验证系统之User对象
  • 科技快讯 | 开源鸿蒙5.0版本即将亮相;英国测试AI摄像头抓酒驾;Kimi 发布视觉思考模型 k1
  • 单元测试知识总结
  • FFMPEG视频转图片
  • 【大模型微调学习6】-实战Hugging Face Transformers工具库
  • 太速科技-365-基于XC7Z045+AD9361的双收双发无线电射频板卡
  • ubuntu24.04、win11配置pysot
  • 代码随想录-算法训练营-番外(图论03:孤岛的总面积,沉没孤岛,水流问题,建造最大岛屿)
  • vue子组件在什么情况下会更新
  • 按键精灵苹果 iOS 脚本工具的基本编写方法
  • 【Prompt Engineering】5 文本转换
  • 3GPP协议解读_物理层系列(二)_RB SB SC什么关系?