【Bash】脚本也可以单步、断点调试吗?

 本文演示bash脚本在编写完成后,如何通过“调试”来排查潜在问题。

 

  本文所有示例,基于此bash脚本 (array.sh) :

#!/bin/bash

echo "=====this creates an array====="
month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov")

# add or change element to/in array
month[11]="Dec"

echo "=====this creats an associative array====="
declare -A color
color[elephant]="black"
echo ${color[elephant]}

echo "=====this prints out the 4th element in the array====="
echo ${month[3]}

echo "=====this iterates over an array====="
echo "this can iterate over integer-index and associative arrays"

for i in "${!month[@]}"
do
  echo "key  : $i"
  echo "value: ${month[$i]}"
done

for i in "${!color[@]}"
do
  echo "key  : $i"
  echo "value: ${color[$i]}"
done

echo "=====print whole array====="
printf "%s\n" "${month[@]}"
printf "%s\n" "${color[@]}"

print "%\n"

 

  • 01 bash自带调试方案

   使用 “bash -x”,执行如下:


//命令
bash -x array.sh

//输出结果如下:
+ echo '=====this creates an array====='
=====this creates an array=====
+ month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov")
+ month[11]=Dec
+ echo '=====this creats an associative array====='
=====this creats an associative array=====
+ declare -A color
+ color[elephant]=black
+ echo black
black
+ echo '=====this prints out the 4th element in the array====='
=====this prints out the 4th element in the array=====
+ echo Apr
Apr
+ echo '=====this iterates over an array====='
=====this iterates over an array=====
+ echo 'this can iterate over integer-index and associative arrays'
this can iterate over integer-index and associative arrays
+ for i in "${!month[@]}"
+ echo 'key  : 0'
key  : 0
+ echo 'value: Jan'
value: Jan
+ for i in "${!month[@]}"
+ echo 'key  : 1'
key  : 1
+ echo 'value: Feb'
value: Feb
+ for i in "${!month[@]}"
+ echo 'key  : 2'
key  : 2
+ echo 'value: Mar'
value: Mar
+ for i in "${!month[@]}"
+ echo 'key  : 3'
key  : 3
+ echo 'value: Apr'
value: Apr
+ for i in "${!month[@]}"
+ echo 'key  : 4'
key  : 4
+ echo 'value: May'
value: May
+ for i in "${!month[@]}"
+ echo 'key  : 5'
key  : 5
+ echo 'value: Jun'
value: Jun
+ for i in "${!month[@]}"
+ echo 'key  : 6'
key  : 6
+ echo 'value: Jul'
value: Jul
+ for i in "${!month[@]}"
+ echo 'key  : 7'
key  : 7
+ echo 'value: Aug'
value: Aug
+ for i in "${!month[@]}"
+ echo 'key  : 8'
key  : 8
+ echo 'value: Sep'
value: Sep
+ for i in "${!month[@]}"
+ echo 'key  : 9'
key  : 9
+ echo 'value: Oct'
value: Oct
+ for i in "${!month[@]}"
+ echo 'key  : 10'
key  : 10
+ echo 'value: Nov'
value: Nov
+ for i in "${!month[@]}"
+ echo 'key  : 11'
key  : 11
+ echo 'value: Dec'
value: Dec
+ for i in "${!color[@]}"
+ echo 'key  : elephant'
key  : elephant
+ echo 'value: black'
value: black
+ echo '=====print whole array====='
=====print whole array=====
+ printf '%s\n' Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec
+ printf '%s\n' black
black

观察执行结果,开头带有“+”号的行,为原始array.sh脚本中的代码;不带“+”号,则为对应行输出的结果。

适用范围:bash脚本行数较少、逻辑简单时,可用此命令自测。脚本较复杂或有单步调试需求时,推荐下述的工具。

 

 

  • 02 调试利器-bashdb

一、简介

【Bash】脚本也可以单步、断点调试吗?_第1张图片

  bashdb 的主要功能可概括为如下四点:

  1.启动脚本,指定可能影响其行为的所有内容。

  2.使脚本在指定条件下停止。

  3.检查脚本停止后发生的情况。

  4.更改脚本中的内容,以便您可以尝试纠正一个错误的影响,然后继续排查其他的错误。

 

二、实战

  1.安装 

   mac 系统安装,执行如下命令:

brew install bashdb

   安装过程:

【Bash】脚本也可以单步、断点调试吗?_第2张图片

   输入“bashdb --version”,检查安装结果,出现版本号则代表成功:

2.命令列表

若只为调试bash脚本,可忽略此部分,有兴趣深入了解。

【Bash】脚本也可以单步、断点调试吗?_第3张图片

                                                                     (http://bashdb.sourceforge.net)

 

3.常用命令讲解

1)启动调试

bashdb (-L) /Desktop/array.sh

选项“-L”,当bashdb脚本和调试器文件位于同一位置。如果bashdb是从源代码运行的,那需要添加“-L”选项。但如果已经安装了bashdb,则在执行过程中不需要使用“ -L”,相反只需要输入:bashdb /tmp/fact.sh 即可。

【Bash】脚本也可以单步、断点调试吗?_第4张图片

位置信息由文件名和行号组成,如上图:

(/Users/XXX/Desktop/array.sh:3):

 

2)退出调试

quit

【Bash】脚本也可以单步、断点调试吗?_第5张图片

 

3)单步调试

next 
step 

next和step命令,均代表执行下一条语句,区别在于:next遇到函数,不进入函数体;step遇到函数,会进入函数体。

【Bash】脚本也可以单步、断点调试吗?_第6张图片

 

4)列出当前行附近10的行脚本

list

比如当前运行到第14行,则会列出9~18行。

【Bash】脚本也可以单步、断点调试吗?_第7张图片

 

5)设置断点

b 行号

  举例:第28行设置断点

 

6)跳到断点

continue

  设定断点后,通过continue命令,可以直接跳到断点处执行:

【Bash】脚本也可以单步、断点调试吗?_第8张图片

 

7)打印变量

print $变量名

  参考array.sh,第26行定义的变量名为i,执行到第28行时,打印"i"如下:

【Bash】脚本也可以单步、断点调试吗?_第9张图片

 

  掌握了这些,编写完bash脚本之后,调试起来就方便多了。

  That' all.

你可能感兴趣的:(【微信公众号】)