发布时间:2014-09-05 13:34:29作者:知识屋
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
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能