“ 本文演示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
一、简介
bashdb 的主要功能可概括为如下四点:
1.启动脚本,指定可能影响其行为的所有内容。
2.使脚本在指定条件下停止。
3.检查脚本停止后发生的情况。
4.更改脚本中的内容,以便您可以尝试纠正一个错误的影响,然后继续排查其他的错误。
二、实战
1.安装
mac 系统安装,执行如下命令:
brew install bashdb
安装过程:
输入“bashdb --version”,检查安装结果,出现版本号则代表成功:
2.命令列表
若只为调试bash脚本,可忽略此部分,有兴趣深入了解。
(http://bashdb.sourceforge.net)
3.常用命令讲解
1)启动调试
bashdb (-L) /Desktop/array.sh
选项“-L”,当bashdb脚本和调试器文件位于同一位置。如果bashdb是从源代码运行的,那需要添加“-L”选项。但如果已经安装了bashdb,则在执行过程中不需要使用“ -L”,相反只需要输入:bashdb /tmp/fact.sh 即可。
位置信息由文件名和行号组成,如上图:
(/Users/XXX/Desktop/array.sh:3):
2)退出调试
quit
3)单步调试
next
step
next和step命令,均代表执行下一条语句,区别在于:next遇到函数,不进入函数体;step遇到函数,会进入函数体。
4)列出当前行附近10的行脚本
list
比如当前运行到第14行,则会列出9~18行。
5)设置断点
b 行号
举例:第28行设置断点
6)跳到断点
continue
设定断点后,通过continue命令,可以直接跳到断点处执行:
7)打印变量
print $变量名
参考array.sh,第26行定义的变量名为i,执行到第28行时,打印"i"如下:
掌握了这些,编写完bash脚本之后,调试起来就方便多了。
That' all.