标签:脚本 shell 错误 -- 编程 set 十九 调试
一 shell脚本错误类型
1)Syntax Error -->'语法'错误 -->静态分析-->'shellcheck' -->'讲解省略'
2)Runtime Error -->'运行时'错误 -->'动态调试' -->'变量类型等'
3)Logic Error -->'逻辑'错误 -->'设计层面'
备注: 这三种问题,'难度'依次增加
二 几个调试常用的内置变量
shell '小脚本'的调试基本都是echo 来处理
$LINENO'set或sh特有的' $FUNCNAME'set或sh特有的 $BASH_LINENO 这几个变量记录了脚本当前的'执行位置(shell脚本的行号)',以及正在'执行的函数'
echo "func: $FUNCNAME ln: $LINENO ln2:${BASH_LINENO[1]} brother: ${FUNCNAME[1]}"
三 set
verbose -v 为调试打开'verbose'模式 --> '详细过程'
xtrace -x 打开'调试回响'模式
nounset -u 在扩展一个'没有的设置的变量'的时候,显示错误的信息,'并退出' -->'变量相关' -->'变量必须初始化否则退出'
errexit -e 如果一个命令'返回一个非0'退出状态值(失败),就'退出'
1) 多个命令以";"分割是否能影响
2) ()中的命令是以'整体'判断,还是'其中一个'
noglob -d 禁止路径名扩展,即'关闭通配符 '
posix 改变'shell行'为以便符合'POSIX要求'
-o 是查看'各个选项'的开启状况
allexport -a 将声明的变量提升为'环境变量'
备注: + 、"-" 分别用于关闭或者'打开'某些特性
场景:
1)set 除了上面的-e option 可以帮助'优化脚本'外,其"--" option 更有用
2)在'调用'shell脚本的时候,通常'传递参数'给shell脚本,这些参数叫做'位置参数',那么有没有可能在没有用shell脚本的时候也'使用位置参数'呢? 这时候就可以用 "--" option来实现
重点: 各个参数的'含义',适用'场景'
附注: helm set '帮助'文档
① e
二 bash|sh
1)-n: 不会执行该脚本,仅进行shell脚本的'基本语法检查',并给出'错误提示' -->'功能不太强'
2)-v: 执行脚本时,先将'脚本的内容输出'到屏幕上,然后'执行脚本',如果有错误,也会给出'错误提示' -->'verbose显示整个执行过程' -->'脚本嵌套'
3)-x: 实现shell脚本'逐条'语句的'跟踪'--->将'执行脚本'的内容及输出'显示到屏幕中' -->'xtrace'
特点: 将执行的'每一条命令'和'结果'依次打印出来-->'常用'
① -n参数
② -x参数
1)默认'PS4'作为调试参数,默认是'+',可以自定义加上一些shell'内置变量','帮助定位'
备注: 'FUNCNAME'只在'函数体'起作用
2)一般对于'非synax'的问题,通过'-x'参数,打印出对应的值与'预期'的做比较,知道问题所在 -->'logic错误'
③ echo
备注: 插入到'bash'调试的章节
+++++++++++++'场景判断'+++++++++++++
1)获取的'值'是不是预期的-->'read'
2)某个模块'例如函数'是否执行-->'临时让其打印'
3)某个值'是否'修改成功,打印该'值'
三 debug能力
bashsuppru pro插件
IDE插件
四 常见错误
① 直接copy代码
场景: 'window'上'可以执行'的shell脚本,复制到linux上执行'报错了'
隐蔽性: 看着'没有'语法检测,但是'执行错误'
1)查看格式是否有问题
1)cat -v file.sh
2)vim --> :set list
关注点: Windows的'换行符'是'^M',linux下一看有这个说明'有问题'
2)解决策略
1)直接从'windows'复制过来的,可能文件自带格式为'dos',修改格式即可
2)直接转化-->'dos2unix'命令 --> dos2unix file.sh
四 参考博客
标签:脚本,shell,错误,--,编程,set,十九,调试 来源: https://blog.csdn.net/wzj_110/article/details/115588336
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。