检查语法

-n选项只做语法检查,而不执行脚本。

sh -n script_name.sh

启动调试

sh -x script_name.sh

进入调试模式后,Shell依次执行读入的语句,产生的输出中有的带加号,有的不带,如下。带加号表示该条语句是Shell执行的。不带加号表示该语句是Shell产生的输出。2个加号是shell中的子shell 产生的

+ array=(1 2 3 4 5)
+ for i in '${array[*]}'
+ echo 1
1

长代码调试

分段,分函数调试

中断调试

在调试过程中可以按Ctrl + Z中断调试,观察结果,然后再按fg键继续调试即可。

调试代码块

上面的-x选项是调试整个脚本的,如果脚本很大,会很不方便,还有一种方法是调试某一块代码的,如下

set -x
...
code block
...
set +x

这样,只对set -x与set +x之间的代码进行跟踪。

调试函数

set -x

Function call

set +x

常见错误诊断

xxx.sh: cannot shift

这种错误一般是参数传递有误,比如没有给参数,或者参数个数少了。因为shell脚本使用shift来获取下一个参数,如果个数不对,shift命令就会失败。

xxx.sh: ^M: not found

^M是Windows上的回车符\r在UNIX上的显示形式。这种情况多半是在Windows上编辑了shell脚本,然后拿到UNIX/Linux上执行。只要将文件中所有的\r删除即可。

tr -d "\r" <oldfile.sh > newfile.sh

或者一个更标准的方法,因为\r的ASCII码是\015,所以可以这样。

tr -d "\015" < oldfile.sh > newfile.sh

设置调试陷阱

稍后继续。。。

sample: 一个shell 输出如下:

+ ORAENV=oraenv       ->shell 产生
++ ps -e -o args           ->子shell 产生
++ grep pmon
++ grep -v grep
++ awk -F_ '{print $3}'
++ sort
+ SIDS='stat10g           -> 回到shell 
statdb'
++ echo stat10g statdb
+ for ORACLE_SID in '`echo $SIDS`'
+ ORAENV_ASK=NO
+ export ORACLE_SID
+ . oraenv                     ->shell 产生
+++ uname -s               -> 子子shell 产生
++ MACH_TYPE=Linux
++ case ${MACH_TYPE} in
++ ORATAB=/etc/oratab
++ TNS_ADMIN=/etc
++ ORA_ORAENV=/usr/local/bin/ora_oraenv
++ export TNS_ADMIN ORA_ORAENV
+++ awk -F: '/^[^#]/{printf "\n %s",$1}' /etc/oratab
++ SIDLIST='
stat10g
statdb
oemdb
cdboem'
++ case "${ORAENV_ASK:-''}" in
++ . /usr/local/bin/ora_oraenv
+++ SILENT=
+++ case ${ORACLE_TRACE:-""} in
+++ N=
+++ C=
+++ echo '\c'
+++ grep c
+++ N=-n
+++ '[' /oracle11g/product/11.2 = 0 ']'
+++ OLDHOME=/oracle11g/product/11.2
+++ case ${ORAENV_ASK:-""} in
+++ NEWSID=stat10g
+++ export ORACLE_SID
++++ dbhome stat10g
+++ ORAHOME=/oracle10g/product/10.2
+++ case $? in
+++ ORACLE_HOME=/oracle10g/product/10.2
+++ export ORACLE_HOME
+++ case ${LD_LIBRARY_PATH:-""} in
++++ echo /oracle11g/product/11.2/lib
++++ sed 's;/oracle11g/product/11.2/lib;/oracle10g/product/10.2/lib;g'
+++ LD_LIBRARY_PATH=/oracle10g/product/10.2/lib
+++ export LD_LIBRARY_PATH
+++ case "$OLDHOME" in
+++ case "$PATH" in
++++ echo /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/perf/bin:/home/oracle/bin:/oracle11g/product/11.2/bin:/oracle11g/local::/oracle11g/product/11.2/bin:
++++ sed 's;/oracle11g/product/11.2/bin;/oracle10g/product/10.2/bin;g'
+++ PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/perf/bin:/home/oracle/bin:/oracle10g/product/10.2/bin:/oracle11g/local::/oracle10g/product/10.2/bin:
+++ export PATH
++++ LANG=C
++++ ulimit
+++ ULIMIT=unlimited

http://www.cnblogs.com/softwaretesting/archive/2012/02/06/2339671.html

转 Shell调试篇的更多相关文章

  1. Shell调试篇 转

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...

  2. 总结一篇shell调试技巧及常见的脚本错误

      #常见的调试命令工具 1.使用bash命令参数调试 #使用 [root@game ~]# sh [-xvn] test.sh #参数解释: -x:将执行的脚本内容输出出来,可以看到执行的过程 -n ...

  3. shell调试选项

    [shell调试选项] 一些常用选项的用法: -n 只读取shell脚本,但不实际执行 -x 进入跟踪方式,显示所执行的每一条命令 -c "string" 从strings中读取命 ...

  4. 【转】Android LCD(四):LCD驱动调试篇

    关键词:android LCD TFTSN75LVDS83B  TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...

  5. OD调试篇3-小软件破解1

    OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...

  6. OD调试篇1—Hello

    OD调试篇1—Hello 要求:通过OD将程序的标题“I love fishc.com”改为“I love you” 一.找到程序的标题“I love fishc.com” 1.把程序拖到OD运行出现 ...

  7. VC调试篇

    难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...

  8. 单片机裸机下写一个自己的shell调试器(转)

    源: 单片机裸机下写一个自己的shell调试器

  9. 安卓开发,adb shell 调试sqlite3数据库

    安卓开发,adb shell 调试sqlite3数据库 在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看. 第一步,将adb加入到系统变量中. 这样就可以在命令行 ...

随机推荐

  1. 【Tomcat】Tomcat性能分析

    一.预研任务介绍和预研目标 任务介绍: Apache Tomcat是目前较为流行的web服务器,以其技术先进.性能稳定著称,其次它还是一个免费开源的项目. Tomcat性能分析的意义在于能为日常工作中 ...

  2. Thinkphp5.0 的视图view的比较标签

    Thinkphp5.0 的视图view的比较标签 {eq name="a" value="10"} <p>相等</p> {else/} ...

  3. hdu - 1172 猜数字 (思维题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1172 这个题换一种想法,可以找出四位数中所有满足条件的数看是否只有一个. #include <iostre ...

  4. ETL增量单表同步简述_根据timestamp增量

    ETL增量单表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 步骤简单说明: 1.设置job的执行属性,如 ...

  5. 无线安全课堂:手把手教会你搭建伪AP接入点

    概述 *本文假设读者对设置伪AP接入点以及Apache配置有足够了解. 在本攻击场景中,我们将使用到alfa无线网卡以及用于网络访问的以太网连接(虚拟机环境下,物理机下无需此配置).你也可以使用虚拟接 ...

  6. 如何以正确的顺序重新安装驱动程序 | Dell 中国

      购买 支持 社区 我的帐户     购买 支持 社区   如何以正确的顺序重新安装驱动程序 在戴尔笔记本电脑或台式机上手动重新安装Microsoft Windows操作系统后,您还必须以正确的顺序 ...

  7. [AngularJS] Store the entry url and redirect to entry url after Logged in

    For example when a outside application need to visit your app address: https://www.example.com/#/lob ...

  8. 详细介绍Linux telnet命令的使用

    对Linux系统进行远程登录,Linux telnet命令是必须得掌握的一个知识,虽然telnet并不是唯一的远程登录的方案,但是不可否认它是最常用的,所以很有必要详细了解Linux telnet命令 ...

  9. 嵌入式开发之davinci--- 8127 和8148的区别

    1.主要的差别是8148有sata接口,8127没有 2.经过最近各方查找,应该是8107中把DSP砍掉了,8127如1楼所示 http://www.deyisupport.com/question_ ...

  10. 使用SwingWork反而阻塞SwingUI

    最近加载图片的过程中使用了SwingWork来下载图片,但是发现会使得Swing的UI界面假死 查看了一下资料,SwingWork的设计初衷就是为了解决卡死UI的问题,正常使用应该没有问题,但是有一点 ...