博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转 Shell调试篇
阅读量:6293 次
发布时间:2019-06-22

本文共 2706 字,大约阅读时间需要 9 分钟。

 

 

 

 

 

 

 

 

检查语法

-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

转载于:https://www.cnblogs.com/feiyun8616/p/6894726.html

你可能感兴趣的文章
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>