免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2148 | 回复: 3
打印 上一主题 下一主题

[其他] 关于shell脚本调试技术中的DEBUG的使用 [复制链接]

论坛徽章:
5
程序设计版块每日发帖之星
日期:2016-04-15 06:20:00每日论坛发贴之星
日期:2016-04-15 06:20:0015-16赛季CBA联赛之八一
日期:2016-07-08 09:20:28操作系统版块每日发帖之星
日期:2016-08-03 06:20:002016科比退役纪念章
日期:2016-10-30 13:59:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-08-18 19:53 |只看该作者 |倒序浏览
本帖最后由 274920831 于 2018-08-20 10:10 编辑

在曹羽中写的Shell脚本调试技术,相关链接中:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/


提到了关于DEBUG的使用和set -x , set +x的使用:
首先我说一下我对set  -x 这个的理解,举例说明吧,一个最简单的脚本:
--------------------------------------------------------------
[andrew@localhost ~]$ cat exp5.sh
set -x
rm -rf 1.txt
set +x
rm -rf 2.txt
--------------------------------------------------------------
当我运行这个脚本时,会出现这样的输出:
--------------------------------------------------------------
[andrew@localhost ~]$ bash exp5.sh
+ rm -rf 1.txt
+ set +x
--------------------------------------------------------------

在set -x和set +x之间的是rm -rf 1.txt,这个命令会被跟踪,而放在下面的rm -rf 2.txt则不会。

我现在对DEBUG不理解,首先按照他的说法,定义一个DEBUG函数可以使植入调试钩子的过程更简洁方便,那么按照他的写法,我把DEBUG函数放在我的脚本里面来:



----------------------------------------------------------
[andrew@localhost ~]$ cat exp4.sh
DEBUG()
{
if [ "$DEBUG" = "true" ]; then
     $@  
fi
}




DEBUG set -x
rm -rf 1.txt
DEBUG set +x
rm -rf 2.txt
----------------------------------------------------------

当我执行这个脚本的时候,如下所示,它是没有任何输出的,那么这里的DEBUG的作用是什么,是不是当有ERROR的时候,它才会报错:
-----------------------------------------------------------
[andrew@localhost ~]$ bash exp4.sh
[andrew@localhost ~]$
-----------------------------------------------------------

同时还有一个问题就是:
DEBUG()
{
if [ "$DEBUG" = "true" ]; then
     $@  
fi
}



这个DEBUG函数里面的,$@是什么意思? shell中

$@  传递给脚本或函数的所有参数


在这里的 $@ 我应该如何来理解 ?






论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
2 [报告]
发表于 2018-08-20 09:57 |只看该作者
本帖最后由 christmas1102 于 2018-08-20 10:12 编辑

脚本调试没用过,不太清楚
$@ 放在function里面就是这个func的所有传参,试了下:
  1. #!/usr/bin/env bash
  2. x() {
  3.   if [ -n $1 ]
  4.   then
  5.     $@
  6.   fi
  7. }
  8. x $1 $2 $3
  9. 执行
  10. sh script "cat 1" 2 3
复制代码


执行的结果同等与执行命令 cat 1 2 3,因为$@是所有传参,文本效果 = echo "$@"

so,这条的意思就是 把$@里面的东西组合起来执行,比如 ls /root 是 $1 $2 ,那$@ 就当作 ls /root 这一条命令来执行



论坛徽章:
0
3 [报告]
发表于 2018-08-20 13:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
程序设计版块每日发帖之星
日期:2016-04-15 06:20:00每日论坛发贴之星
日期:2016-04-15 06:20:0015-16赛季CBA联赛之八一
日期:2016-07-08 09:20:28操作系统版块每日发帖之星
日期:2016-08-03 06:20:002016科比退役纪念章
日期:2016-10-30 13:59:12
4 [报告]
发表于 2018-08-21 10:52 |只看该作者
回复 2# christmas1102

非常感谢,我刚才试了下,确实如此。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP