#!/bin/sh -
OLDPATH="$PATH"
PATH=/bin:/usr/bin
export PATH #确保所有的子进程继承我们的安全查找路径
PROGRAM=`basename $0` #获取程序名称
VERSION=1.0 #版本号
all=no #no时,只查找其中的一个路径
EXITCODE=0 #返回码,无错误的时候返回 0
error() #error函数
{
echo "$@" 1>&2 #将标准输出重定向到标准错误输出
usage_and_exit 1 #调用 usage_and_exit函数 参数为 1
}
usage() #usage函数,用于指示程序怎么用
{
echo "Usage: $PROGRAM [--all] [--?] [--help] [--version] envvar pattern(s)"
}
version() #version函数,显示程序版本
{
echo "$PROGRAM version $VERSION"
}
usage_and_exit()
{
usage
exit 1
}
warning()
{
echo "$@" 1>&2
EXITCODE=`expr $EXITCODE + 1` #返回码加1,用expr,expr主要用于shell的算术运算
}
while test $# -gt 0 #$#代表程序参数的个数,从0开始,gt表示大于,ge表示大于等于,lt,le,eq
do
case $1 in #对程序名后面的参数处理
--all | -a)
all=yes
;;
--help | -h)
usage_and_exit 0
;;
--version | -v)
version
exit 0
;;
-* )
error "Unrecognized option: $1"
;;
* )
break;
;;
esac
shift #用shift抛弃已被处理的第一个参数,并且移到参数列表的下一个
done
envvar="$1" #此时,参数列表中只剩下环境变量名称以及要寻找的文件,将环境变量赋给envvar
test $# -gt 0 && shift
test "x$envvar" = "xPATH" && envvar=OLDPATH # x是为了避免变量的展开,这里等于判断用的是一个 =
dirpath=`eval echo '${'"$envvar"'}' 2>/dev/null | tr : ' '` # echo 后面的构建字符串不能有空格
if test -z "$envvar" # 判断环境变量是否为空
then
error Environment variable missing or empty
elif test "x$dirpath" = "x$envvar" # 判断 : 有没有转化成空格
then
error "Broken sh on this platform: cannot expand $envvar"
elif test -z "$dirpath" # 判断要使用的路径集合是否为空
then
error Empty directory search path
elif test $# -eq 0 # 判断参数是否为0
then
exit 0
fi
for pattern in "$@" # 要查找的文件集合
do
result= # 结果初始化为空
for dir in $dirpath # 要使用的路径集合
do
for file in $dir/$pattern
do
if test -f "$file" # 判断文件是否存在以及是否是一个常规文件
then
result="$file"
echo $result
test "$all" = "no" && break 2
fi # break后面的 2 表示跳出2个循环
done
done
test -z "$result" && warning "$pattern: not found" # 结果为空,没有找到
done
test $EXITCODE -gt 125 && EXITCODE=125 # 处理返回码
exit $EXITCODE