getopts语句的语法:
getopts option-string variable
其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。
getopts对命令行给出的选项进行分析,过程如下:
ü getopts检查所有命令行参数,找到以”-”字符开头的字符;
ü 当找到以”-”字符开头的参数后,将跟在”-”字符后的字符与在option-string中给出的字符进行比较;
ü 若找到匹配,指定的变量variable被设置成选项,否则,variable被设置成”?”字符;
ü 重复上面三项,直到考虑完所有的选项;
ü 当分析结束后,getopts返回非零值并退出。
下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程序除了完成unix的标准命令date的功能外,还增加了许多新的选项。
#newdate
if [ $# -lt 1 ];then
#newdate
if [ $# -lt 1 ];then
date
else
while getopts mdyDHMSTJjwahr OPTION
do
do
case $OPTION in
m)date '+%m';;
d)date '+%d';;
y)date '+%y';;
D)date '+%D';;
H)date '+%H';;
M)date '+%M';;
S)date '+%S';;
T)date '+%T';;
j)date '+%j';;
J)date '+%y%j';;
w)date '+%w';;
a)date '+%a';;
h)date '+%h';;
r)date '+%r';;
\?)echo "无效的选项!$OPTION";;
esac
done
fi
d)date '+%d';;
y)date '+%y';;
D)date '+%D';;
H)date '+%H';;
M)date '+%M';;
S)date '+%S';;
T)date '+%T';;
j)date '+%j';;
J)date '+%y%j';;
w)date '+%w';;
a)date '+%a';;
h)date '+%h';;
r)date '+%r';;
\?)echo "无效的选项!$OPTION";;
esac
done
fi
$ newdate -J
94031
$ newdate -a -h -d
Mon
Jan
31
$ newdate -ahd
Mon
Jan
31
94031
$ newdate -a -h -d
Mon
Jan
31
$ newdate -ahd
Mon
Jan
31
有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在 option_string中选项字母后加一个冒号。当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。额外参数和参数之间用空格隔开。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。
下面的例子,实现拷贝一个文件,并给文件赋一个新的名字。-c选项指定程序拷贝的次数,-v选项要求显示新创建文件的文件名。
# Syntax: duplicate [-c integer] [-v] filename COPIES=1
VERBOSE=N
while getopts vc:OPTION
do
case $OPTION in
c)COPIES=$OPTARG;;
v)VERBOSE=Y;;
\?)echo "无效参数!"
exit 1;;
esac
done
if [ $OPTIND -gt $# ]
then
echo "No file name specified"
exit 2
fi
shift 'expr $OPTIND - 1'
FILE=$1
COPY=0
while [ $COPIES -gt $COPY ]
do
COPY='expr $COPY + 1'
cp $FILE $ {FILE} $ {COPY}
if [ VERBOSE = Y }
then
echo ${FILE} $ {COPY}
fi
done
c)COPIES=$OPTARG;;
v)VERBOSE=Y;;
\?)echo "无效参数!"
exit 1;;
esac
done
if [ $OPTIND -gt $# ]
then
echo "No file name specified"
exit 2
fi
shift 'expr $OPTIND - 1'
FILE=$1
COPY=0
while [ $COPIES -gt $COPY ]
do
COPY='expr $COPY + 1'
cp $FILE $ {FILE} $ {COPY}
if [ VERBOSE = Y }
then
echo ${FILE} $ {COPY}
fi
done
输出结果为:
$ duplicate -v fileA
fileA1
$ duplicate -c 3 -v fileB
fileB1
fileB2
fileB3
fileA1
$ duplicate -c 3 -v fileB
fileB1
fileB2
fileB3
没有评论:
发表评论