首页 > 系统相关 >shell 调试方法

shell 调试方法

时间:2023-10-17 10:45:43浏览次数:51  
标签:脚本 shell echo 命令 trap 方法 调试

shell 在 linux 系统中比较常见,简单的脚本可以看着确实没难度,但是当脚本功能复杂后,看起来就不那么流畅了,所以掌握一些调试方式还是很有必要的,这里我收集了一次常用的调试方式。

shell调试的方法

  1. echo 语句
    通过在脚本代码中插入 echo 语句输出变量值、执行状态等信息,在脚本中直接打印还是比较方便的

  2. shell 脚本本身提供的一些方法

    • -n 读一遍脚本中的命令但不执行,主要用于检查脚本中的语法错误。
    • -v 一边执行脚本,一边将执行过程中的脚本命令打印到标准输出。
    • -x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
    • +x 关闭跟踪执行信息。
  3. trap 命令
    使用 trap 命令可以捕获并处理脚本中的信号或错误。通过在脚本中设置 trap 命令,可以在发生特定事件时执行自定义操作,如输出日志、打印变量值等。

  4. 调试工具
    使用 trap 命令可以捕获并处理脚本中的信号或错误。通过在脚本中设置 trap 命令,可以在发生特定事件时执行自定义操作,如输出日志、打印变量值等。

实验一

使用 echo 输出变量信息,脚本命令如下

#!/bin/bash

fruits=("apple" "banana" "orange")
for fruit in "${fruits[@]}"
do
	echo "I like $fruit"
done

输出如下所示:

实验二

在执行的时候使用增加 -x 参数,开启调试信息输出,命令如下

bash -x test.sh

输出如下所示:

实验三

在解释器参数中加上调试参数,这里的功能和命令中直接添加一样,所以输出的结果也实验二相同,添加的方式如下

#!/bin/bash -xv
#!/bin/sh -x

输出如下所示:

实验四

在脚本中使用 set -x 可以启用跟踪模式,将执行的每一行命令及其扩展结果显示出来,方便查看具体的执行流程。使用 set +x 可以关闭跟踪模式,所以可以使用此方法对其中一部分脚本进行调试,脚本如下

#!/bin/bash

set -x
fruits=("apple" "banana" "orange")
set +x

for fruit in "${fruits[@]}"
do
        echo "I like $fruit"
done

输出如下所示:

实验五

  1. trap 是shell自带的捕获信号量的指令。trap命令用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。

  2. 命令格式如下:

    trap [-lp] [ARG] [SIGSPECS]
    # -l 列出信号名称与对应的数值
    # -p 列出信号与其绑定的命令列表
    # ARG 与指定信号绑定的命令。如果 ARG 为空字符串,表示忽略信号;如果 ARG 不指定(缺省)或为-,表示执行信号的默认动作
    # SIGSPECS 信号列表,可以是信号名称,也可以是信号对应的数值。可用信号可以使用trap-l查看
    
  3. 测试脚本

    #!/bin/bash
    
    # 定义错误处理函数
    handle_error() {
      echo "An error occurred in the script!"
      echo "Printing error message and exiting..."
      echo "Error message: $1"
      exit 1
    }
    
    # 设置错误处理函数为脚本的错误处理器
    trap 'handle_error "$BASH_COMMAND"' ERR
    
    echo "Start script"
    
    # 通过故意引发错误来测试错误处理
    unknown_command
    
    echo "This line will not be executed"
    
    echo "End script"
    
  4. 测试结果

实验六

也可以使用相关的 shell 脚本使用工具,调试起来应该会更方便,但是我也没使用过,前面的饿调试方式基本够用了,以后有使用到合适的调试工具,我在补上

标签:脚本,shell,echo,命令,trap,方法,调试
From: https://www.cnblogs.com/jzcn/p/17768914.html

相关文章

  • 第三章 方法和作用域
    3.1创建方法方法:是具名的语句序列,如C语言、C++等编程语言,可将方法视作与函数或者子程序相似的东西。每个方法都有名称和主体。方法名:方法的用途。方法主体:包含方法被调用时实际执行的语句。可以向方法提供数据处理,并让他返回处理结果。3.1.1声明方法声明C#方法语法ret......
  • PowerShell IDE - PowerShellPlus(4)- IIS X功能介绍
    IIS管理功能,根据安装版本不同X显示主版本号。比如我的是IIS7,则是IIS7.互联网信息服务(英语:InternetInformationServices,简称IIS),是由微软公司提供的基于运行MicrosoftWindows的互联网基本服务。最初是WindowsNT版本的可选包,随后自带在Windows2000、WindowsXPProfessional和Wind......
  • 大模型微调方法总结
    大模型微调方法总结参考链接:https://blog.csdn.net/v_JULY_v/article/details/132116949前言:随着chatGPT的备受欢迎,大模型异常火爆,各大厂商相继推出自己的大模型。二级公司和用户需要根据自身的垂直领域微调这些具有语义理解能力的大模型,以满足特定领域的业务需求,如医疗,法......
  • 更换当前url的方法
    location=locationlocation=location.hreflocation=window.locationlocation=self.locationlocation=window.location.hreflocation=self.location.hreflocation=location['href']location=window['location']location=window[......
  • 前端调试时不改代码但又想打印变量信息怎么办?
    我们都知道,Chrome的控制台可以在调试的时候打断点。程序运行到这的时候会停止但有时候我们不希望程序断点执行,我们只是想看一些变量的信息。按照以前的方式,我们只能去修改源码增加打印日志的语句,这样既浪费时间,又需要在调试完成后清理掉我们打印的日志代码。其实,Chrome浏览......
  • 随笔-调试-常用命令零散记录 1
    【01】valgrindviewvalgrind--log-file='valgrind_report.log'--time-stamp=yes--tool=memcheck--leak-check=full--show-leak-kinds=all./exec【02】gdbviewgdb-iex'setpaginationoff'-iex'setconfirmoff'-iex'set......
  • 通过JPA API访问数据库的方法和范例
    HibernateAPI和JPAAPI中主要接口之间有一些对应关系,例如:JPAAPI-----------------------HibernateAPIEntityManagerFactory-----SessionFactoryEntityManager----------------SessionEntityTransaction-------------TransactionSessionFactory接口在JPAAPI中的对等接口......
  • 提示-bash telnet command not found的解决方法
    Linuxcentos运行telnet命令,出现下面的错误提示:[root@localhost~]#telnet127.0.0.1-bash:telnet:commandnotfound解决方法:安装telnet服务centos、ubuntu安装telnet命令的方法.yumlisttelnet*列出telnet相关的安装包yuminstalltelnet-server......
  • 在Bash shell脚本中,如何检查目录是否存在?
    内容来自DOC[https://q.houxu6.top/?s=在Bashshell脚本中,如何检查目录是否存在?](https://q.houxu6.top/?s=在Bashshell脚本中,如何检查目录是否存在?)在Bashshell脚本中,什么命令可以检查目录是否存在?要检查目录是否存在,可以使用以下命令:if[-d"$DIRECTORY"];thene......
  • Shell(八):循环与结构化命令
    反复执行某一个命令或某一组命令,需要用到循环结构化命令。循环命令用于特定条件下决定某些语句重复执行的控制方式,具有封闭型的单入单出性质。即进入循环结构后,只要循环条件未达到结束状态,就时钟执行循环体内的操作。Shell中提供三种常用的循环语句,分别是for循环......