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

sh 命令调试选项(推荐)

选项 说明
-c -c后的字符串中读取命令。
-n 检查是否存在语法错误,但不会实际执行。
-x 将执行的每一条命令和结果依次打印出来。
-v 执行过的脚本命令打印到标准输出。

使用方法:

字符串读取脚本。

  1. $ sh -c 'if [ 1 -lt 2 ];then echo "true"; else echo "false"; fi'
  2. true

注:临时测试 shell 语法或者小段脚本时使用。

检查脚本是否存在语法错误。

  1. $ sh -n daodaotest.sh

跟踪调试 shell 脚本,将执行的每一条命令结果依次打印出来。

  1. $ sh -x daodaotest.sh
  2. + '[' 2 -lt 2 ']'
  3. + COUNT=3
  4. + PARAMETER=daodaotest
  5. + (( i = 1 ))
  6. + (( i <= 3 ))
  7. + echo '第 1 遍打印:daodaotest'
  8. 1 遍打印:daodaotest
  9. + (( i++ ))
  10. + (( i <= 3 ))
  11. + echo '第 2 遍打印:daodaotest'
  12. 2 遍打印:daodaotest
  13. + (( i++ ))
  14. + (( i <= 3 ))
  15. + echo '第 3 遍打印:daodaotest'
  16. 3 遍打印:daodaotest
  17. + (( i++ ))
  18. + (( i <= 3 ))
  19. + exit 0

跟踪调试 shell 脚本,将执行的每一条命令和结果依次打印出来。

  1. $ sh -xv daodaotest.sh
  2. #!/bin/bash
  3. # 调试脚本示例
  4. # 使用方法
  5. usage() {
  6. echo "Usage: sh $0 COUNT PARAMETER"
  7. echo "\t COUNT 循环打印次数"
  8. echo "\t PARAMETER 打印字符串"
  9. echo "示例:"
  10. echo "\t 1. 打印 daodaotest 2 次"
  11. echo "\t sh $0 2 daodaotest"
  12. }
  13. # 判断参数
  14. if [ $# -lt 2 ];
  15. then
  16. usage
  17. exit 1
  18. fi
  19. + '[' 2 -lt 2 ']'
  20. # 打印次数
  21. COUNT=$1
  22. + COUNT=3
  23. # 打印字符串
  24. PARAMETER=$2
  25. + PARAMETER=daodaotest
  26. # 循环打印
  27. for (( i = 1; i <= $COUNT; i++));
  28. do
  29. echo "第 $i 遍打印:$PARAMETER"
  30. done
  31. + (( i = 1 ))
  32. + (( i <= 3 ))
  33. + echo '第 1 遍打印:daodaotest'
  34. 1 遍打印:daodaotest
  35. + (( i++ ))
  36. + (( i <= 3 ))
  37. + echo '第 2 遍打印:daodaotest'
  38. 2 遍打印:daodaotest
  39. + (( i++ ))
  40. + (( i <= 3 ))
  41. + echo '第 3 遍打印:daodaotest'
  42. 3 遍打印:daodaotest
  43. + (( i++ ))
  44. + (( i <= 3 ))
  45. exit 0
  46. + exit 0

注:本人最常用-x参数,能解决 90% 的脚本调试问题。

set 方法

在脚本中用set命令。

  • set -xv表示启用;
  • set +xv表示禁用。

使用方法:

  1. $ cat daodaotest.sh
  2. set -xv
  3. ..... 省略
  4. set +xv
  5. $ sh daodaotest.sh 2 daodaotest
  6. # 使用方法
  7. usage() {
  8. echo "Usage: sh $0 COUNT PARAMETER"
  9. echo "\t COUNT 循环打印次数"
  10. echo "\t PARAMETER 打印字符串"
  11. echo "示例:"
  12. echo "\t 1. 打印 daodaotest 2 次"
  13. echo "\t sh $0 2 daodaotest"
  14. }
  15. # 判断参数
  16. if [ $# -lt 2 ];
  17. then
  18. usage
  19. exit 1
  20. fi
  21. + '[' 2 -lt 2 ']'
  22. # 打印次数
  23. COUNT=$1
  24. + COUNT=2
  25. # 打印字符串
  26. PARAMETER=$2
  27. + PARAMETER=daodaotest
  28. # 循环打印
  29. for (( i = 1; i <= $COUNT; i++));
  30. do
  31. echo "第 $i 遍打印:$PARAMETER"
  32. done
  33. + (( i = 1 ))
  34. + (( i <= 2 ))
  35. + echo '第 1 遍打印:daodaotest'
  36. 1 遍打印:daodaotest
  37. + (( i++ ))
  38. + (( i <= 2 ))
  39. + echo '第 2 遍打印:daodaotest'
  40. 2 遍打印:daodaotest
  41. + (( i++ ))
  42. + (( i <= 2 ))
  43. exit 0
  44. + exit 0

注: 在脚本非常复杂时,set可以进行局部调试,在需要调试的代码块前后设置即可。

工具

shellcheck

shell 脚本静态检查工具,可以帮助你写出刚好的脚本。

官网:https://www.shellcheck.net/

手册:https://github.com/koalaman/shellcheck

使用方法:

  1. $ shellcheck daodaotest.sh
  2. In daodaotest.sh line 8:
  3. echo "\t COUNT 循环打印次数"
  4. ^---------------^ SC2028: echo may not expand escape sequences. Use printf.
  5. In daodaotest.sh line 9:
  6. echo "\t PARAMETER 打印字符串"
  7. ^------------------^ SC2028: echo may not expand escape sequences. Use printf.
  8. In daodaotest.sh line 11:
  9. echo "\t 1. 打印 daodaotest 2 次"
  10. ^-----------------------^ SC2028: echo may not expand escape sequences. Use printf.
  11. In daodaotest.sh line 12:
  12. echo "\t sh $0 2 daodaotest"
  13. ^---------------------^ SC2028: echo may not expand escape sequences. Use printf.
  14. In daodaotest.sh line 28:
  15. for (( i = 1; i <= $COUNT; i++));
  16. ^----^ SC2004: $/${} is unnecessary on arithmetic variables.
  17. For more information:
  18. https://www.shellcheck.net/wiki/SC2028 -- echo may not expand escape sequen...
  19. https://www.shellcheck.net/wiki/SC2004 -- $/${} is unnecessary on arithmeti...

BASH Debugger

bashdb 是一个类 GDB 的调试工具,可以运行断点设置、变量查看等常见调试操作。

官网:http://bashdb.sourceforge.net/

常用参数:

  1. h:查看帮助。
  2. help 命令:命令的具体信息。
  3. n:执行下一条语句。
  4. s n:单步执行 n 次。
  5. b n:在行号 n 处设置断点。
  6. c n:一直执行到行号 n 处。
  7. l:显示上下文代码。
  8. print:打印变量值,例如 print $COUNT
  9. finish:执行到程序最后或断点处。
  10. q or exit:退出。
  11. R:重新执行。

使用方法:

  1. $ bashdb --debug daodaotest.sh
  2. bash debugger, bashdb, release 5.0-1.1.2
  3. Copyright 2002-2004, 2006-2012, 2014, 2016-2019 Rocky Bernstein
  4. This is free software, covered by the GNU General Public License, and you are
  5. welcome to change it and/or distribute copies of it under certain conditions.
  6. (/Users/jlh/tmp/daodaotest.sh:15):
  7. 15: if [ $# -lt 2 ];
  8. # 执行下一条语句。
  9. bashdb<0> n
  10. (/Users/jlh/tmp/daodaotest.sh:22):
  11. 22: COUNT=$1
  12. # 显示上下文代码。
  13. bashdb<1> l
  14. 17: usage
  15. 18: exit 1
  16. 19: fi
  17. 20:
  18. 21: # 打印次数
  19. 22: => COUNT=$1
  20. 23: # 打印字符串
  21. 24: PARAMETER=$2
  22. 25:
  23. 26: # 循环打印
  24. # 单步执行 3 次。
  25. bashdb<2> s 3
  26. (/Users/jlh/tmp/daodaotest.sh:27):
  27. 27: for (( i = 1; i <= $COUNT; i++));
  28. ((i <= 3))
  29. bashdb<3> l
  30. 22: COUNT=$1
  31. 23: # 打印字符串
  32. 24: PARAMETER=$2
  33. 25:
  34. 26: # 循环打印
  35. 27: => for (( i = 1; i <= $COUNT; i++));
  36. 28: do
  37. 29: echo "第 $i 遍打印:$PARAMETER"
  38. 30: done
  39. 31:
  40. # 打印 $COUNT 参数值
  41. bashdb<4> print $COUNT
  42. 3
  43. # 执行到最后
  44. bashdb<5> finish
  45. 1 遍打印:daodaotest
  46. 2 遍打印:daodaotest
  47. 3 遍打印:daodaotest
  48. Debugged program terminated normally. Use q to quit or R to restart.
  49. # 退出
  50. bashdb<6> q
  51. bashdb: That's all, folks...

shell 脚本常用调试方法的更多相关文章

  1. Shell脚本的调试方法

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

  2. Shell脚本的调试技术

    编程中必不可少的一点就是调试,Shell脚本以其强大的功能令人向往,当然,它的强大之处不只是体现在语言的实现功能上,更强大的是它的调试功能,下面,我将以实例讲解Shell脚本的调试技术. 下面是我所用 ...

  3. shell脚本常用技巧

    shell脚本常用技巧 1.获取随机字符串或数字 ~]#echo $RANDOM | md5sum | cut -c 1-6 ~]#openssl rand -base64 4 | cut -c 1- ...

  4. shell脚本常用参数

    shell 脚本 常用参数 #!/bin/sh # 在脚本第一行脚本头 # sh为当前系统默认shell,可指定为bash等shell sh -x # 执行过程 sh -n # 检查语法 (a=bbk ...

  5. VC的常用调试方法

    前言 VS是非常强大的IDE,所以掌握VSVC的常用方法,将会使得我们找出问题解决问题事半功倍. 目录 VSVC的常用调试方法 前言 1. Watch窗口查看伪变量 2. 查看指针指向的一序列值 3. ...

  6. shell常用调试方法

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.s 进入调试模式后,Shell依次执行读入的语句,产生的输出中有 ...

  7. Shell 脚本常用命令

    Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook.在工作过程中整理了一下,贴在这里已备查看. 1           Shell中的特殊符号 ...

  8. SHELL 脚本----常用的命令

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂   建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行she ...

  9. shell脚本怎么调试

    shell是Linux系统上常用的一种脚本语言.一般从事web后台开发的从业者,都会用到shell,因此shell调试也是一项必备的技能.本文教你如何进行shell脚本调试. 工具/原料   Linu ...

随机推荐

  1. JS事件流模型

    JS事件流模型 事件捕获Event Capturing是一种从上而下的传播方式,以click事件为例,其会从最外层根节向内传播到达点击的节点,为从最外层节点逐渐向内传播直到目标节点的方式. 事件冒泡E ...

  2. QQ小程序支付

    QQ小程序支付 Java后端 同学折腾QQ小程序的支付折腾了好几天,没有完成统一下单,因为我做过微信和支付宝支付,他就让我帮忙搞 我搞了好两三个小时,也没搞出来,最终我觉得问题在商户key那里,问了几 ...

  3. CMDB资产采集方式

    一:Agent方式 原理:在每台服务器装上agent客户端程序,定时向数据库发送指定的资产信息. 优点:速度快. 缺点:服务器上需要多装一个软件 import subprocess import re ...

  4. 使用docker构建双主mysql

    我们有的时候需要双主mysql, 这样无论哪个数据库出现了问题的话都可以继续使用数据库.把两个数据库挂到一个代理上面,这样哪个服务出问题了,另外一个就可以继续服务了.当然本文不是主要谈代理的,所以这个 ...

  5. Anaconda常用命令收藏----后期还会更新

    一.更换jupyter notobook的打开目录 一般载在安装好Anaconda的时候,打开jupyter指向的目录一般是系统的根目录,如C:\Users\25282,但是这样的话对C盘是个不小的负 ...

  6. Excel知识点与技巧1

    1.工作区:方便两个工作表之间进行对比 2.工作表标签颜色 3.交换两列的次序 4.快速到达边界:即快速到达第一行或最后一行 5.冻结窗格:可以固定某几行或某几列一直存在于窗口,不会随着往下拉或往右拉 ...

  7. git的cd命令

    这个命令是进入某个文件夹的命令.进入文件夹后可以对文件夹中的文件进行一系列操作.

  8. python快速入门基础知识

    1.变量赋值与语句 #python 不需要手动指定变量类型.不需要分号 #To assign the value 365 to the variable days,we enter the varia ...

  9. 走近源码:Redis如何清除过期key

    "叮--",美好的周六就这么被一阵钉钉消息吵醒了. 业务组的同学告诉我说很多用户的帐号今天被强制下线.我们的帐号系统正常的逻辑是用户登录一次后,token的有效期可以维持一天的时间 ...

  10. Python第六章-函数05-迭代器&生成器

    python作为一个既面向对象,又支持函数式编程的语言,函数的使用方面有很多特点. 比如:闭包,装饰器,迭代器等 函数的高级应用 容器:生活中常见的容器有哪些?袋子,盆子,水杯,书包,铅笔盒... 容 ...