路径查找脚本pathfind (shell)


#!/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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值