Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129060
  • 博文数量: 22
  • 博客积分: 1533
  • 博客等级: 上尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-30 11:09
文章分类

全部博文(22)

文章存档

2011年(1)

2010年(7)

2008年(14)

我的朋友

分类:

2008-08-30 11:42:30

语法: 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


阅读(1294) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:shift命令

给主人留下些什么吧!~~