linuxshell编程指南第二十三章------脚本调试
shell编程最烦人的一项工作是调试问题。有一些方法可以借鉴,但是最好能在问题出现前防止大部分错误,为此应遵循以下规则。
需要牢记的一点是当shell打印出一个脚本错误后,不要只看那些疑问行。而是要观察整个相关代码段。shell不会对错误进行精确定位,而是在试图结束一个语句时进行错误统计。
循环错误
for、while、until和case语句中的错误是指实际语句段不正确。也许漏写了固定结构中的一个保留字。
下面错误打印信息done,这是一个很好的线索。因为这时知道正在处理一个while语句。回溯脚本段,检查while语句,是否漏写或错写了关键字,如do或者正在使用的条件语句。
第二个典型错误是漏写引号错误。经常要注意这个问题,因为此错误经常出现。这里给出解决这类错误的唯一方案是在脚本中确保所有引号成对出现。
当shell打印出错误行后,通常在vi编辑器中查看文件。使用vi的set nu选项调试错误,先进入vi,然后点击< ESC>键,后跟一冒号,再键入set nu <return>,这时给出文本行号,然后进入shell打印错误行。
另一个常见错误是在使用-eq语句时忘记在测试条件一边使用数字取值。
如果得到下列错误提示,通常是由于两件事情:需要在变量和方括号间加空格;在方括号里漏写操作符。
[: missing ']'
经验上讲大多数错误是由于使用变量时大小写保持不一致。例如经常在开始定义时用大写,然后在变量调用时用了小写字符,这样难免变量会没有赋值。
使用for循环时,有时会忘了在循环的列表部分用$符号,特别是在读取字符串时。
set命令可辅助脚本调试。以下是set命令常用的调试选项:
set-n 读命令但并不执行。
set-v 显示读取的所有行。
set-x 显示所有命令及其参数。
将s e t选项关闭,只需用+替代-。有人总认为+应该为开,而-应为关闭,但实际刚好相反。可以在脚本开始时将s e t选项打开,然后在结束时关闭它。或在认为有问题的特殊语句段前后打开及关闭它。
下面看一个例子。以下脚本将名字保存在变量列表中。用户输入名字, for循环循环变量列表查看是否有匹配模式。注意这里在脚本开始时使用了set -x,并在结尾部分关闭它。
[root@localhost huangcd]# cat error
#!/bin/bash
set -x
LIST="Peter Susan John Barry Lucy Norman Bill Leslie"
echo -n "Enter your Name:"
read NAME
for LOOP in $LIST
do
if [ "$LOOP" = "$NAME" ]
then
echo "you are on the list,"
break
fi
done
set +x
[root@localhost huangcd]# sh error
+ LIST='Peter Susan John Barry Lucy Norman Bill Leslie'
+ echo -n 'Enter your Name:'
Enter your Name:+ read NAME
Lucy
+ for LOOP in '$LIST'
+ '[' Peter = Lucy ']'
+ for LOOP in '$LIST'
+ '[' Susan = Lucy ']'
+ for LOOP in '$LIST'
+ '[' John = Lucy ']'
+ for LOOP in '$LIST'
+ '[' Barry = Lucy ']'
+ for LOOP in '$LIST'
+ '[' Lucy = Lucy ']'
+ echo 'you are on the list,'
you are on the list,
+ break
+ set +x
- 11-131分钟学会U盘启动安装Linux系统
- 11-13克隆MAC地址来绕过强制门户
- 11-13Linux运维常见故障及处理的 32 个锦囊妙计
- 11-13如何快速以管理员权限运行Linux命令?
- 11-13超全面的Linux应急响应技巧
- 11-136 款面向 Linux 用户的开源绘图应用程序
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 11-18LG新能源宣布与Bear Robotics达成合作,成为
- 11-18机构:三季度全球个人智能音频设备市场强势
- 11-18闲鱼:注册用户过6亿 AI技术已应用于闲置交
- 11-18美柚、宝宝树回应“涉黄短信骚扰”:未发现
- 11-01京东七鲜与前置仓完成融合