最近正在阅读《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中从右向左删除第一个匹配的模式