语法: getopts optstring varname [arg……]
optstring 是合法选项字母的字符串。
varname 是变量名称
每次getopts调用时,varname变量会被更新,它的值是找到的选项字母。当getopts发现一个非法选项时,把varname的值设定为?,如果选项后跟着冒号,则表示改选项需要一个参数,getopts会将参数值放置到变量OPTARG中,当getopts发现一个选项本来应该含有参数,但却没有参数时,把varname的值设定为:,OPTARG设定为缺少参数的选项字母。
optstring以冒号开头,当输入的选项不存在时,有两个作用:第一,它不会显示任何错误信息,第二,除了将变量varname设置为问号外,OPTARG还包含了给定的不合法选项字母。
例子:
getopts :but:a:jf arg
当有两个(或两个以上)选项时,若第一个选项不带参数(-bu或-b -u)时,执行完其后的语句后,将继续执行第二个选项后的内容;若第一个选项带参数,当选项为-tu时,getopts将把u赋给变量OPTARG,当选项为-t -u时,将把-u赋给变量OPTARG,而此时不管选项后面有没有参数。
(这样的话功能就实现不了了,咋办呢???)
$cat getopts
SKIPBLANKS=
TMPDIR=/tmp
CASE=lower
while getopts :bt:u arg
do
case $arg in
b) SKIPBLANKS=TRUE ;;
t) if [ -d "SOPTARG" ]
then
TMPDIR=$OPTARG
else
echo "$0: $OPTARG is not a directory." >&2
exit 1
fi ;;
u) CASE=upper ;;
:) echo "$0: Must supply an argument to -$OPTARG." >&2
exit 1 ;;
\?) echo "Invalid option -$OPTARG ignored." >&2 ;;
esac
done
运行:
(1)只有一个选项时
$ bash -x getopts -t aklfjalk
+ SKIPBLANKS=
+ TMPDIR=/tmp
+ CASE=lower
+ getopts :bt:u arg
+ case $arg in
+ '[' -d SOPTARG ']'
+ echo 'getopts: aklfjalk is not a directory.'
getopts: aklfjalk is not a directory.
+ exit 1
(2)有两个选项,第一个不带参数
$ bash -x getopts -bt alfula
+ SKIPBLANKS=
+ TMPDIR=/tmp
+ CASE=lower
+ getopts :bt:u arg
+ case $arg in
+ SKIPBLANKS=TRUE
+ getopts :bt:u arg
+ case $arg in
+ '[' -d SOPTARG ']'
+ echo 'getopts: alfula is not a directory.'
getopts: alfula is not a directory.
+ exit 1
$ bash -x getopts -b -t alfula
+ SKIPBLANKS=
+ TMPDIR=/tmp
+ CASE=lower
+ getopts :bt:u arg
+ case $arg in
+ SKIPBLANKS=TRUE
+ getopts :bt:u arg
+ case $arg in
+ '[' -d SOPTARG ']'
+ echo 'getopts: alfula is not a directory.'
getopts: alfula is not a directory.
+ exit 1
(3)有两个选项,第一个带参数
$ bash -x getopts -tb aklfjalk
+ SKIPBLANKS=
+ TMPDIR=/tmp
+ CASE=lower
+ getopts :bt:u arg
+ case $arg in
+ '[' -d SOPTARG ']'
+ echo 'getopts: b is not a directory.'
getopts: b is not a directory.
+ exit 1
$ bash -x getopts -t -b aklfjalk
+ SKIPBLANKS=
+ TMPDIR=/tmp
+ CASE=lower
+ getopts :bt:u arg
+ case $arg in
+ '[' -d SOPTARG ']'
+ echo 'getopts: -b is not a directory.'
getopts: -b is not a directory.
+ exit 1
|
阅读(1288) | 评论(0) | 转发(0) |