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 调试方法的更多相关文章

  1. (转)shell调试方法

    ---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...

  2. Linux - Shell脚本调试方法

    Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...

  3. VxWorks操作系统shell命令与调试方法总结

    VxWorks下的调试手段 主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤.思路. 1         Tornado的调试工具 嵌入式实时操作系统VxWorks和集成开发 ...

  4. Shell - Shell脚本调试方法

    Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...

  5. Shell脚本的调试方法

    Shell脚本的调试方法 Shell提供了一些用于调试脚本的选项,如下所示: -n    读一遍脚本中的命令但不执行,用于检查脚本中的语法错误 -v    一边执行脚本,一边将执行过的脚本命令打印到标 ...

  6. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  7. shell 脚本常用调试方法

    曾经我刚开始学习 shell 脚本时,除了知道用 echo 输出一些信息外,并不知道其他方法,仅仅依赖 echo 来查找错误,比较难调试且过程繁琐.效率低下.本文介绍下我常用的一些 shell 脚本调 ...

  8. shell脚本调试方法

    我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用 Shell 调试模式. 写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工 ...

  9. GDB中应该知道的几个调试方法 来自陈皓

    GDB中应该知道的几个调试方法 2011年2月10日陈皓发表评论阅读评论62,325 人阅读   七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询 ...

  10. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

随机推荐

  1. 记录-Vue.js模板编译过程揭秘:从模板字符串到渲染函数

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Vue.js是一个基于组件化和响应式数据流的前端框架.当我们在Vue中编写模板代码时,它会被Vue编译器处理并转换为可被浏览器解析的Jav ...

  2. Oracle的md5

    CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2) RETURN VARCHAR2 IS retval varchar2(32); BEGIN ret ...

  3. 巧用dblink 实现多进程并行查询

    概述 对于分区表的大数据统计分析,由于数据量巨大,往往需要采用并行.但是数据库并行的效率相比分进程分表统计还是有比较大的差距.本文通过巧用dblink,实现分进程分分区统计数据. 例子 kingbas ...

  4. Scala mutable.Map可变的Map

    1 package chapter07 2 3 import scala.collection.mutable 4 5 object Test09_MutableMap { 6 def main(ar ...

  5. C语言线程安全问题

    线程安全问题 #include <stdio.h> #include <tinycthread.h> #include <io_utils.h> int count ...

  6. #树上启发式合并,位运算#CF570D Tree Requests

    题目 给定一个以 \(1\) 为根的 \(n\) 个结点的树,每个点上有一个字母\((a-z)\),每个点的深度定义为该节点到 \(1\) 号结点路径上的点数. 每次询问 \(a, b\) 查询以 \ ...

  7. #博弈论#Poj 1740 A New Stone Game

    题目 两个人轮流操作,每次选择一个非空石堆后, 选择扔掉至少一个石子后可将剩余石子任意移动至其余非空石堆, 也可以不移,无石子可取者为败,问先手是否必胜 分析 感性理解一下,如果有两堆个数相同的石子, ...

  8. #dp#JZOJ 1281 旅行

    分析 考虑每次都是取出一个连续段置换一下, 可以预处理出相邻差的绝对值的前缀和, 但是如果正序无法知道上一段是从哪个终止的 所以倒序就可以了 代码 #include <cstdio> #i ...

  9. Git 教程:解密 .gitignore 文件、合并分支、解决冲突、及 Git 帮助

    Git 帮助 如果你忘记了命令或命令的选项,你可以使用 Git 帮助. 在命令行中,有几种不同的使用帮助命令的方式: git command -help - 查看特定命令的所有可用选项 git hel ...

  10. C++ 异常和错误处理机制:如何使您的程序更加稳定和可靠

    在C++编程中,异常处理和错误处理机制是非常重要的.它们可以帮助程序员有效地处理运行时错误和异常情况.本文将介绍C++中的异常处理和错误处理机制. 什么是异常处理? 异常处理是指在程序执行过程中发生异 ...