zoukankan      html  css  js  c++  java
  • 转 Shell调试篇

    检查语法

    -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上的回车符 在UNIX上的显示形式。这种情况多半是在Windows上编辑了shell脚本,然后拿到UNIX/Linux上执行。只要将文件中所有的 删除即可。

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

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

    tr -d "15" < 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 " %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

  • 相关阅读:
    MTK手机默认音量大小调节工具
    问题:MTK手机软件开发平台中字串资源添加进去了,菜单也能用,但是菜单上的字符串显示不出来。
    GNU ARM汇编快速入门
    想成为嵌入式程序员应知道的0x10个基本问题
    学习MTK需要的环境,平台,资料
    BSP 概念解析
    作为程序员的苦恼
    浅谈程序员的职业规划
    入行三年回顾
    程序员谈“应用推广”
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/6894726.html
Copyright © 2011-2022 走看看