检查语法
-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"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