您的位置:首页 > 运维架构 > Shell

用来检测输入的选项$1是否在PATH中的shell脚本

2016-08-14 00:00 751 查看
今天无意中发现一本挺有意思的shell编程的书,是e文的,内容是101个shell案例,坚持明天看一个,写点心得。

下面是例子001:

#!/bin/sh
# inpath - Verifies that a specified program is either valid as is,
#  or that it can be found in the PATH directory list.

in_path()
{
# Given a command and the PATH, try to find the command. Returns
# 0 if found and executable, 1 if not. Note that this temporarily modifies
# the IFS (input field separator) but restores it upon completion.

cmd=$1    path=$2     retval=1
oldIFS=$IFS  IFS=":"

for directory in $path
do
if [ -x $directory/$cmd ] ; then
retval=0   # if we're here, we found $cmd in $directory
fi
done
IFS=$oldIFS
return $retval
}

checkForCmdInPath()
{
var=$1

# The variable slicing notation in the following conditional
# needs some explanation: ${var#expr} returns everything after
# the match for 'expr' in the variable value (if any), and
# ${var%expr} returns everything that doesn't match (in this
# case, just the very first character. You can also do this in
# Bash with ${var:0:1}, and you could use cut too: 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
}

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


这脚本目的是用来检测输入的选项$1是否在PATH中。

这脚本有几个地方值得注意的:

1)它运用了函数嵌套,在checkForCmdInPath里嵌套了in_path函数。

2)if [ "${var%${var#?}}" = "/" ] 这语句中的${var%${var#?}}是显示变量的第一个字符,也可以用${varname:1:1} 或$(echo $var | cut -c1)替代。

3) elif ! in_path $var $PATH ; then 这意思是如果in_path $var $PATH 执行结果不为0的话则

问题:

发现输入 echo , echo_err, /etco_err 都返回正确结果,但输入 /etc/echo_right (存在着执行文件但不在PATH中)却返回found in PATH。我想这脚本还有需要完善的地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  检测输入