读《Shell 脚本实践》——inpath.sh

最近正在阅读《Shell脚本实践》一书,这一系列文章是对书中内容的学习与整理。

inpath.sh

#! /bin/bash
# inpath -- 验证指定程序是否有效,如果参数以绝对路径的形式给出则检查改路径是否存在且可执行,如果参数没有以 / 开头,则检查该命令是否位于$PATH记录的目录下且可执行

in_path()
{
        cmd=$1
        ourpath=$2
        result=1
        #记录当前字段分隔符,并修改为':'
        oldIFS=$IFS
        IFS=":"
        #遍历参数2指定的目录列表
        for directory in $ourpath
        do
                if [ -x $directory/$cmd ] ; then
                        #如果该命令存在且可执行,则in_path成功退出
                        result=0
                fi
        done
        #恢复w字段分隔符为原始值
        IFS=$oldIFS
        return $result
}

checkForCmdInPath()
{
        var=$1
        if [ "$var" != "" ] ; then
                #下面使用了字符串切分语法
                if [ "${var:0:1}" = "/" ] ; then
                        if [ ! -x $var ] ; then
                                return 1
                        fi
                elif ! in_path $var "$PATH" ; then
                        return 2
                fi
        fi
}

#下面是测试代码,当该脚本直接作为库使用时,应该删去下面的代码
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
exit 0

里面用到了字符串变量拆分:

${var:m:n} 

表示从下表为m的字符开始截取,向后截取n个字符,如果没有指定n则表示截取后面的全部字符。

脚本中写的${var:0:1}则表示截取var中字符串的首字符

另一种与之等价但符合POSIX规范的做法是:

${var%${var#?}} 

#表示从var中删除第一个匹配的模式

%表示从var中从右向左删除第一个匹配的模式

发布了7 篇原创文章 · 获赞 8 · 访问量 192

猜你喜欢

转载自blog.csdn.net/cxm2643199642/article/details/103757942
今日推荐