我相信不少学习者在用shell脚本编程的时候遇到过这样的问题,当他不注意打错了代码,脚本执行时发生意想不到的问题,导致了严重的后果。比如这个例子,原本想要删除一个目录dir中的所有文件,就输入了这两行代码:
cd /usr/diro
rm *
从本质上来说,这两行代码没有任何问题,只要是变量diro中存储的目录名字存在就可以。但是如果/usr/diro不存在,这样cd 命令会运行失败,脚本会继续执行下一行代码,将会删除当前工作目录中的所有文件。完成不是期望的结果。由于这个失误,可能会销毁服务器中的重要文件。
因此我们需要掌握防错编程,当编程的时候,验证假设非常重要。这意味着要仔细得计算脚本所使用的程序和命令的退出状态。
让我们看一些能够提高这个设计的方法。
首先,在cd 命令执行成功之后,再运行rm 命令,可能是明智的选择。
cd $dir_name && rm *
这样,如果cd 命令运行失败后,rm 命令将不会执行。这样比较好,但是仍然有可能未设置变量dir_name 或其变量值为空,从而导致删除了用户家目录下面的所有文件。这个问题也
能够避免,通过检验变量dir_name 中包含的目录名是否真正地存在:
[[ -d $dir_name ]] && cd $dir_name && rm *
通常,当某种情况(比如上述问题)发生的时候,最好是终止脚本执行,并对这种情况提示错误信息:
if [[ -d $dir_name ]]; then
if cd $dir_name; then
rm *
else
echo "cannot cd to '$dir_name'" >&2
exit 1
fi
else
echo "no such directory: '$dir_name'" >&2
exit 1
fi
这里,我们检验了两种情况,一个名字,看看它是否为一个真正存在的目录,另一个是cd命令是否执行成功。如果任一种情况失败,就会发送一个错误说明信息到标准错误,然后脚本
终止执行,并用退出状态1 表明脚本执行失败。
例如将$dir_name改为/usr/diro后执行:
jeremy@ubuntu:/usr/dir$ chmod 755 /usr/dir/fg
jeremy@ubuntu:/usr/dir$ /usr/dir/fg
no such directory: '/usr/diro'