Shell脚本调试方法

服务器

浏览数:348

2019-9-16

    Shell脚本调试的主要工作是发现引发脚本报错的原因以及在脚本代码中定位发生错误的行,使程序按预期的逻辑完成工作。下面介绍几种主要的方法。

1、sh脚本调试选项

  语法:sh [-n] [-x] [-v] Script.sh

  参数说明:

-n: 检查shell脚本中是否存在语法错误。只读取shell脚本,但不执行。
-x:提供跟踪执行信息,将执行的每一条命令、每一个变量的值和结果一次打印出来
-v:一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。

  使用方法:

  (1)检查脚本语法是否存在错误。调用语法:sh -n ${脚本文件名}

$ sh -n Myscript.sh

  (2)检查shell代码命令执行和变量输出情况。常用语法:sh -xv ${脚本文件名}。推荐使用。

$ sh -xv Myscript.sh 
#!/bin/bash

num1=20
+ num1=20
num2=15
+ num2=15
if [ "${num1}" -lt "${num2}" ];then
   echo "${num1} is less than ${num2}"
else
   echo "${num1} is greater than ${num2}"
fi
+ '[' 20 -lt 15 ']'
+ echo '20 is greater than 15'
20 is greater than 15

  还有一种常用的方法。就是将shebang从#!/bin/bash改成#!/bin/bash -xv。这样就可以不用任何其他选项就可以启用调试功能。

2、echo/printf输出调试方法

  在认为可能有问题的代码前后使用echo/printf打印出变量值。特别是变量在用作判断条件情况。

#!/bin/bash

#echo "The variable num equal:$num"
if [ $num -eq 5 ];then
  echo "The number equal to 5" #假设这条语句没有输出,就把变量num值打出来看看
else
  echo "The number not equal to 5"
fi

3、set -x和set +x调试方法

    shell的执行选项除了可以在启动shell时指定外,也可以在脚本中用set命令来指定。 “set -参数”表示启用某选项,”set +参数”表示关闭某选项。有时候我们并不需要在启动时用”-x”选项来跟踪所有的命令行,这时我们可以在脚本中使用set -x和set +x对脚本进行部分调试。如以下脚本片段所示:

#!/bin/bash

set -x # #启动"-x"选项 要跟踪的程序段
num=15
if [ $num -eq 5 ];then
  echo "The number equal to 5"
else
  echo "The number not equal to 5"
fi
set +x  #关闭"-x"选项

执行结果输出如下:

$ ./Myscript.sh 
+ num=15
+ '[' 15 -eq 5 ']'
+ echo 'The number not equal to 5'
The number not equal to 5
+ set +x

   如果要调试输出所有代码,可以在代码开头处添加set -x。效果等同于shell -xv myScript.sh

4、自定义格式调试

  前面介绍的调试手段都是bash内建的,都是以固定的格式生成调试信息。但是很多情况下,我们需要以自定义格式显示调试信息。这可以通过传递_DEBUG环境变量来建立。如下代码

#!/bin/bash

function DEBUG()
{
  [ "$_DEBUG" == "on" ] && $@ || :
}

for((i=0;i<=3;i++))
do
  echo "$i"
done

   可以将调试功能设置为”on”来运行上面脚本。如下:

  _DEBUG=on ./script.sh

  在每一个需要打印调试信息的语句前加DEBUG。如果没有把_DEBUG=on传递给脚本,那么调试信息就不会打印出来。在Bash中,命令”:”告诉shell不要进行任何操作。

5、删减代码方法

  这种方法通常适用于使用上述两种方法还是定位不出问题的情况,因为有些报错确实很不明显,在代码量太多的情况下又不好调试。可以尝试删除一部分代码,缩小代码定位范围。反过来说明,代码量越少的情况下调试效率越高。

6、shellcheck代码静态检查工具

  shellcheck工具个人用过确实挺好用的。但是在公司外没有找到一个可执行的shellcheck工具。源文件编译安装需要cabal,我在我的SuSE系统上没装起来。查阅了些资料,看到过如下两种方式安装成功的。大家可以在自己的环境试试。

  1、使用zypper安装

Linux:~ #zypper install shellcheck

 2、use OneClickInstall – https://software.opensuse.org/package/ShellCheck

 参考链接:

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

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

作者:Beng Dou