分类:
2008-08-26 23:33:47
使用环境变量的shell脚本(如MAILER和PAGER)存在一些隐藏的危险,可能有部份设置是指向不存在的程序。举个例子说下,在显示脚本的
输出时,如果我们选择灵活性强的PAGER设置来取代一个制式的特定工具,那么要如何确保PAGER值是指向一个存在的程序呢?而如果它是指向一个不存在
的程序,那么脚本将会中断。下面这个脚本会帮我们判断程序是否存在于PATH中,同时它也可以作为一个在不同工作环境中使用脚本技术(包含方程式与变数)
的良好范例。
脚本源代码
#!/bin/sh
# inpath - 证实我们所提供的程序是否能够执行
# 或存在于系统的设定的PATH中
in_path()
{
# 给出一个路径及命令,脚本尝试去查询这个命令
# 如果在PATH中找到并且可以执行,则返回0,否则返回1
# 它将暂时修改IFS的值,执行后即恢复IFS的值.
cmd=$1
path=$2
retval=1
oldIFS=$IFS
IFS=":"
for directory in $path
do
if [ -x $directory/$cmd ] ; then
retval=0 # 在指定的目录($directory)中找到指令($cmd),返回0
fi
done
IFS=$oldIFS
return $retval
}
checkForCmdInPath()
{
var=$1
# 下面的变量运作需要作下说明:${var#expr}会留下变量中expr后的一个字元,
# 而${var%expr}则留下var变量中与expr不同的字串,下面的例子中,恰巧会留下第一个字元
# 在Bash的环境下我们也可以使用${var:0:1}或cut -c1
if [ "$var" != "" ] ; then
if [ "${var%${var#?}}" = "/" ] ; then
if [ ! -x $var ] ; then
return 1
fi
elif ! in_path $var $PATH ; then
return 2
fi
fi
}
*************************************************************
注意:我编写的脚本要存放到哪里去?
我
建议你在主目录(home目录)下新增一个名为"scripts"的新目录,并将其完整的路径加在PATH的变量中。我们可以通过echo
$PATH指令来查看正确的PATH。要修改来修改PATH变量的话,使用vi工具去编辑你的主目录下的".login"或".profile"文档,,
以符合我们的需求。
**************************************************************
运行脚本
在执行这个脚本程序之前,我们必须在这段代码后再附加上一段,让它能够对前面执行的传回值进行判断,代码如下:
if [ $# -ne 1 ] ; then
echo "Usage: $0 command" >&2 ; exit 1
fi
checkForCmdInPath "$1"
case $? in
0 ) echo "$1 found in PATH" ;;
1 ) echo "$1 not found or not executable" ;;
2 ) echo "$1 not found in PATH" ;;
esac