总结一篇shell调试技巧及常见的脚本错误
#使用
[root@game ~]# sh [-xvn] test.sh #参数解释:
-x:将执行的脚本内容输出出来,可以看到执行的过程
-n:不执行脚本,检查脚本语法是否有问题,给出错误的提示
-v:执行脚本时,先将脚本的内容输出到屏幕上,再执行脚本,如果有错误给出错误提示
#说明:不会执行脚本,只检查有无语法错误,如果没有检测到,就无输出
[root@game scripts]# cat test7.sh
#!/bin/bash
echo "guoke123"
[root@game scripts]# sh -n test7.sh
#脚本没有语法错误,所以没有输出 #演示脚本存在语法错误
#!/bin/bash
if [ `netstat -untpl | grep httpd | wc -l` -gt ];then
echo "httpd is Running
else
echo "httpd service down" | mail -s "httpd" @qq.com
systemctl restart httpd
fi
[root@game scripts]# sh -n test1.sh
test1.sh: line : unexpected EOF while looking for matching `"'
test1.sh: line : syntax error: unexpected end of file
#提示:第5行结尾没有双引号
-v参数:打印错误
[root@game scripts]# sh -v test1.sh
#!/bin/bash
if [ `netstat -untpl | grep httpd | wc -l` -gt ];then
echo "httpd is Running
else
echo "httpd service down" | mail -s "httpd" @qq.com
systemctl restart httpd
fi
test1.sh: line : unexpected EOF while looking for matching `"'
test1.sh: line : syntax error: unexpected end of file
-x参数:打印执行过程
#!/bin/bash
if [ `netstat -untpl | grep httpd | wc -l` -gt ];then
echo "httpd is Running"
else
echo "httpd service down" | mail -s "httpd" @qq.com
systemctl restart httpd
fi #打印执行过程
[root@game scripts]# sh -x test1.sh
++ netstat -untpl
++ wc -l
++ grep httpd
+ '[' -gt ']'
+ echo 'httpd service down'
+ mail -s httpd @qq.com
+ systemctl restart httpd
2.使用set命令调试
#常用选项
set -n :读命令但并不执行
set -v : 显示读取的所有行
set -x : 显示所有命令及其参数
#使用
使用set -x可以缩小调试的作用域范围
set -x开启调试功能,set +x关闭调试功能 #示例
#!/bin/bash
set -x
for i in `seq `
do
for n in `seq `
do
[ $i -ge $n ] && echo -en "$i x $n" = $(expr $i \* $n)
done
set +x
echo " "
done #执行效果
[root@game scripts]# sh test6.sh
++ seq
+ for i in '`seq 9`'
++ seq
+ for n in '`seq 9`'
+ '[' -ge ']'
++ expr '*'
+ echo -en '1 x 1' =
x = + for n in '`seq 9`'
+ '[' -ge ']'
.....
+ for n in '`seq 9`'
+ '[' -ge ']'
+ set +x
#提示:只调试了set -x 和set +x 这个作用域
3.echo命令调试
一般在可能出现问题的脚本的重要部分加入echo命令 #示例
[root@game scripts]# cat test8.sh
#!/bin/bash
read -p "please input tow num:" a b
echo $a $b
exit #执行效果
[root@game scripts]# sh test8.sh
please input tow num:
4.bashdb
shell调试器bashdb是一个类似GDB的调试工具,可以完成对shell脚本的断点设置、单步执行、变量观察等许多功能。
5.shellcheck
shellcheck是一个可检查sh/bash脚本和命令语法的小工具
[root@game scripts]# cat test.sh
#!/bin/bash yum install net-tools -y >/dev/null
if [$? -eq ]
then
echo "install success"
else
echo "install fail"
fi #执行:报错
[root@game scripts]# sh test.sh
test.sh: line : [: command not found
install fail
#提示:错误在第四行
#2.成对的符号没有写全,漏写
#成对的符号例如:()、[]、""、''等
#示例[]中括号没有写全
[root@game scripts]# cat test1.sh
#!/bin/bash if [ `netstat -untpl | grep httpd | wc -l` -gt ;then
echo "httpd is Running"
else
echo "httpd service down" | mail -s "httpd" @qq.com
systemctl restart httpd
fi #执行效果
[root@game scripts]# sh test1.sh
test1.sh: line : [: missing `]'
#3.if条件语句缺少结尾关键字
[root@game scripts]# cat test2.sh
#!/bin/bash if [ `netstat -untpl | grep mysqld | wc -l` -gt ];then
echo "mysqld is Running"
else
echo "mysqld service down" | mail -s "mysqld" @qq.com
systemctl restart mysqld #执行效果
[root@game scripts]# sh test2.sh
test2.sh: line : syntax error: unexpected end of file
#执行脚本会提示第8行语法错误
#4.循环语句缺少关键字
#示例1:for循环的done少了个e
[root@game scripts]# cat test3.sh
#!/bin/bash
usage(){
echo "directory not found"
} [ ! -d /test ] && usage && exit
cd /test for i in `ls`
do
echo $i
don #执行效果
[root@game scripts]# sh test3.sh
test3.sh: line : syntax error: unexpected end of file #示例2:if条件语句的then少了n
[root@game scripts]# cat test2.sh
#!/bin/bash if [ `netstat -untpl | grep mysqld | wc -l` -gt ];the
echo "mysqld is Running"
else
echo "mysqld service down" | mail -s "mysqld" @qq.com
systemctl restart mysqld
fi
#执行效果
[root@game scripts]# sh test2.sh
test2.sh: line : syntax error near unexpected token `else'
test2.sh: line : `else'
#执行脚本之后会提示语法错误,需要注意的是shell脚本解释器一般不会很精确的定位到错误,需要上下联都看一下
#总结
在进行脚本编写的过程中,应该注重书写的规范性,成对符号或是循环语句应一次写完,再写相应的内容,避免不必要的麻烦,提升开发的效率
总结一篇shell调试技巧及常见的脚本错误的更多相关文章
- Visual Studio 调试技巧:10 篇热文汇总
本文精选了 DotNet 2017年11月份的10篇热门文章.其中有技术分享.技术资源. 注:以下文章,点击标题即可阅读 <Visual Studio的调试技巧 > 调试技巧是衡量程序员 ...
- (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇
背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇
- shell脚本的调试技巧
请参考文章:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/index.html 读后的感觉,还是用shell的选项灵活,方便. ...
- GDB调试技巧:总结篇
目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...
- Linux c c++ 开发调试技巧
看到一篇介绍 linux c/c++ 开发调试技巧的文章,感觉挺使用,哪来和大家分享. 通向 UNIX 天堂的 10 个阶梯Author: Arpan Sen, 高级技术人员, Systems Doc ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- 《Debug Hacks》和调试技巧【转】
转自:https://blog.csdn.net/sdulibh/article/details/46462529 Debug Hacks 作者为吉冈弘隆.大和一洋.大岩尚宏.安部东洋.吉田俊辅,有中 ...
- VS调试技巧,提高调试效率(转):
如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...
- Visual Studio的调试技巧
Visual Studio的调试技巧 [原文地址] Debugging Tips with Visual Studio 2010 [原文发表日期] 2010/8/19 10:48 AM 这是我写的关于 ...
随机推荐
- Asp.Net Core 3.0的依赖注入改变
Asp.Net Core 3.0出来很久了,预览版的时候就被我偶像Lemon大人,带着尝试摸索了一下这个 那么Asp.Net Core 3.0和Asp.Net Core 2.X到底有哪些区别呢? As ...
- CentOS7系统管理与运维实战
CentOS7系统管理与运维实战 下载地址 https://pan.baidu.com/s/1KFHVI-XjGaLMrh39WuhyCw 扫码下面二维码关注公众号回复100007 获取分享码 本书目 ...
- Python 教你自动发微博,每日一句英语
作者:周萝卜 最近在研究用 Python 来制作各个类别的机器人,今天先来分享一个自动发布新浪微博的机器人. 基本思路 其实要实现一个简单的自动发布微博机器人还是不难的,只需要每天按时找好要发布的素材 ...
- 用Unity3D实现太阳系仿真
用Unity3D模拟太阳系仿真 模拟要求 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上. 操作步骤 1.创建如下结构 sun 里包括8大行星, 并且设置好距 ...
- Vscode+Picgo+github+Markdown Preview Enhanced实现Markdown一键上传图床以及导出pdf文件
目录 安装Vscode 安装及配置Picgo插件 安装Markdown Preview Enhance 安装Vscode 安装Vscode(不解释了) 安装及配置Picgo插件 在github中新建仓 ...
- 题解 poj 3304
题目描述 线段和直线判交板子题 分析题目,如果存在这一条直线,那么过这条直线作垂线,一定有一条垂线穿过所有线段,否则不存在.题目转化为寻找一条直线与所有线段有交点. 直线线段判交方法: 1.先判断线段 ...
- 对比两张Excel表数据差异时,遇到数据雷响不一致
表A中为文本(有绿色三角符号),表B为数字(没有三角符号),而自动对比时会检查数据类型,怎么办? 执行对比: 得到结果: 这时候要解决类型问题(即绿色三角形标志) 点击灰色区域全选 哪个黄色感叹号可以 ...
- Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer
Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer 目录 Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer 0x00 ...
- 数据库之Oracle优化技巧(一)
数据库之Oracle优化技巧(一) 1.where子句中的连接顺序 在Oracle数据库中,where子句的执行顺序是自下而上进行解析,根据这个原理,表之间的连接必须写在其他where条件之前,那些可 ...
- STL函数库的应用第一弹——数据结构(队列)
队列是什么? 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作. 和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头 ...