zoukankan      html  css  js  c++  java
  • Linux入门第五天——shell脚本入门(下)基础语法之调试debug

    一、如何debug

      1.通过sh命令的参数:

    sh [-nvx] scripts.sh
    选项与参数:
    -n :不要执行 script,仅查询语法的问题;
    -v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
    -x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!

      示例1:no news is good news

    [root@localhost tmp]# sh -n add1_100.sh
    [root@localhost tmp]# 

      示例2:

    [root@localhost tmp]# sh -n add1_100.sh
    add1_100.sh:行12: 语法错误: 未预期的文件结尾
     1 #!/bin/bash
     2 #简介略
     3 ##########
     4 declare i=1
     5 declare sum=0
     6 while [ ${i} -le 10]
     7 do
     8         sum1=$((${sum}+${i}))
     9         i=$((${i}+1))
    10 done1
    11 echo "the total is ${sum}"

      示例3:使用-x显示执行的内容:

    [root@localhost tmp]# sh -x add1_100.sh
    + declare i=1
    + declare sum=0
    + '[' 1 -le '10]'
    add1_100.sh: 第 6 行:[: 缺少 `]'
    + echo 'the total is 0'
    the total is 0
    [root@localhost tmp]# 
     1 #!/bin/bash
     2 #简介略
     3 ##########
     4 declare i=1
     5 declare sum=0
     6 while [ ${i} -le 10]
     7 do
     8         sum1=$((${sum}+${i}))
     9         i=$((${i}+1))
    10 done
    11 echo "the total is ${sum}"

      // 第六行最后一个中括号缺少空格!

      2.使用调试钩子

    3. 使用"调试钩子"

        学过C语言程序的朋友有这个印象吗:我们经常使用DEBUG宏来控制是否要输出调试信息,在shell脚本中我们同样可以使用这样的机制,如下列代码所示:

    if [ “$DEBUG” = “true” ]; then
    echo “debugging”  #此处可以输出调试信息
    fi

        这样的代码块通常称之为“调试钩子”或“调试块”。在调试钩子内部可以输出任何您想输出的调试信息,使用调试钩子的好处是它是可以通过DEBUG变量来控 制的,在脚本的开发调试阶段,可以先执行export DEBUG=true命令打开调试钩子,使其输出调试信息,而在把脚本交付使用时,也无需再费事把脚本中的调试语句一一删除。

        如果在每一处需要输出调试信息的地方均使用if语句来判断DEBUG变量的值,还是显得比较 繁琐,通过定义一个DEBUG函数可以使植入调试钩子的过程更简洁方便,如下面代码所示:

    $ cat –n exp3.sh
         1  DEBUG()
         2  {
         3  if [ "$DEBUG" = "true" ]; then
         4      $@  
         5  fi
         6  }
         7  a=1
         8  DEBUG echo "a=$a"
         9  if [ "$a" -eq 1 ]
        10  then
        11       b=2
        12  else
        13       b=1
        14  fi
        15  DEBUG echo "b=$b"
        16  c=3
        17  DEBUG echo "c=$c"

        在上面所示的DEBUG函数中,会执行任何传给它的命令,并且这个执行过程是可以通过DEBUG变量的值来控制的,我们可以把所有跟调试有关的命令都作为DEBUG函数的参数来调用,非常的方便。

      更多方式,待更新...

  • 相关阅读:
    BZOJ2144跳跳棋——LCA+二分
    BZOJ[Usaco2017 Jan]Promotion Counting——线段树合并
    BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
    BZOJ1559[JSOI2009]密码——AC自动机+DP+搜索
    BZOJ1222[HNOI2001]产品加工——DP
    [IOI2018]狼人——kruskal重构树+可持久化线段树
    BZOJ3091城市旅行——LCT区间信息合并
    Link-Cut Tree(LCT)&TopTree讲解
    BZOJ3669[Noi2014]魔法森林——kruskal+LCT
    BZOJ4530[Bjoi2014]大融合——LCT维护子树信息
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8047173.html
Copyright © 2011-2022 走看看