eval执行

lqglqglqg 2013-09-20 11:08:54
#!/bin/bash
#
#在查找路径下寻找一个或多个原始文件或文件模式
#查找路径由特定的环境变量所定义
#
#标准输出所产生的结果,通常是查找路径下找到的每个文件之第一个实体的完整路径
#或是 "filename: not found"的标准错误输出
#
#如果所有文件都找到,则退出码为0
#否则,即为找不到的文件个数
#(shell 的退出码限制为125)
#
#
#语法:
# pathfind [-all] [--?] [--help] [--version] envvar pattern(s)
#
#使用--all选项时,在路径下的每个目录都会被查找,
#而非停在第一个找到者
#IFS='
# '
set -x

OLDPATH="$PATH"

PATH=/bin:usr/bin
#export PATH

error()
{
echo "$@" 1>&2
usage_and_exit 1
}

usage()
{
echo "Usage: $PROGRAM [--all] [--?] [--help] [--version] envvar pattern(s)"
}

usage_and_exit()
{
usage
exit $1
}

Version()
{
echo "$PROGRAM version $VERSION"
}

warning()
{
echo "$@" 1>&2
EXITCODE=`expr $EXITCODE + 1`
}

all=no
envvar=
EXITCODE=0
PROGRAM=`basename $0`
VERSION=1.0

while test $# -gt 0
do
case $1 in
--all | --al | --a | -all | -al | -a )
all=yes
;;
--help | --hel | --he | --h | '--?' | -help | -hel | -he | -h | '-?' )
usage_and_exit 0
;;
--version | --versio | --versi | --vers | --ver | --ve | --v |\
-version | -versio | -versi | -vers | -ver | -ve | -v )
Version
exit 0
;;
-* )
error "Unrecognized option: $1"
;;
* )
break
;;
esac
shift
done

envvar="$1"
test $# -gt 0 && shift
test "x$envvar" = "xPATH" && envvar=OLDPATH

################################################?????????????????
dirpath=`eval echo $envvar | tr : ' '`
################################################?????????????????

#为错误情况进行健全检测
if test -z "$envvar"
then
error Environment variable missgin 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
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
done
done
test -z "$result" && warning "$pattern: not found"
done

#限制退出状态是一般unix实现上的限制
test $EXITCODE -gt 125 && EXITCODE=125

exit $EXITCODE
set +x


上面#注释所加的行
dirpath=`eval echo $envvar | tr : ' '`
为什么./pathfind: line 94: tr: command not found啊,如果单独执行此语句或者放在脚本的开头都不会报错
求指点???
...全文
99 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lqglqglqg 2013-09-22
  • 打赏
  • 举报
回复
1. #IFS=' # ' 限制了对后面$dirpath里面以空格隔开的字符串数组的for循环读取,使得不能默认按照空格分隔出数组 2, dirpath=`eval echo $envvar | tr : ' '`本身没错,是由于在前面脚本里修改了PATH这一系统环境变量导致,本脚本运行系统中tr安装在/usb/sbin下了,所以会出现命令无法找到而在终端下可以执行的情况

18,777

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧