免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3798 | 回复: 9
打印 上一主题 下一主题

getopts的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-22 17:46 |只看该作者 |倒序浏览
本帖最后由 小渔儿 于 2010-12-22 17:47 编辑

看资料http://aplawrence.com/Unix/getopts.html上说
foo.sh

  1. #!/bin/bash
  2. while getopts  ":abc:def:ghi" flag
  3. do
  4.   echo "$flag" $OPTIND $OPTARG
  5. done
复制代码
./foo.sh  -c -d
可以避免将-d作为-c的参数,但实际上结果却是
c 3 -d

即把-d作为了-c的一个参数处理,与实际要的结果不同,怎么回事??getopts可以避免这种错误吗
我的bash是2.05b.0(1)-release

论坛徽章:
0
2 [报告]
发表于 2010-12-22 21:49 |只看该作者
看资料上说
foo.sh./foo.sh  -c -d
可以避免将-d作为-c的参数,但实际上结果却是
c 3 -d

即把-d作为了 ...
小渔儿 发表于 2010-12-22 17:46



    你代码里就是就是需要从 -c 后面再读入一个参数啊。。。。

论坛徽章:
0
3 [报告]
发表于 2010-12-23 08:08 |只看该作者
是的,-c需要一个参数,按理这种情况应作为没有给参数才正确,而不应该把-d作为其参数处理,用到程序中应报无参数才对,但结果不是这样的
用户应该输入 -c 123 -d这种形式
当用户输入-c -d这种形式应报错,按资料说getopts应该能够知道-d是选项而不是-c的参数

论坛徽章:
0
4 [报告]
发表于 2010-12-23 09:06 |只看该作者
#!/bin/bash
while getopts :c:d opt
do
    case $opt in
        c) COMMAND
        ;;
        d) COMMAND
        ;;      
        \?) echo "错误的选项"
             usage
        ;;
         echo "$OPTARG 需要一个参数"
        ;;
    esac
done

论坛徽章:
0
5 [报告]
发表于 2010-12-23 10:44 |只看该作者
#!/bin/bash
while getopts :c:d opt
do
    case $opt in
        c) COMMAND
        ;;
        d ...
challenge1984 发表于 2010-12-23 09:06







    还是没明白我的意思,你这个不能解决我的问题,我是假定如果用输入 -c -d这样的要报-c没有参数的错误,你这样还是会把-d作为-c的参数

论坛徽章:
0
6 [报告]
发表于 2010-12-23 10:48 |只看该作者
查已一下,同样的问题有人问过
http://bbs.chinaunix.net/thread-1549344-1-1.html

没人说到点上,这里高手怎么都不在了??

论坛徽章:
0
7 [报告]
发表于 2010-12-23 11:12 |只看该作者
查已一下,同样的问题有人问过


没人说到点上,这里高手怎么都不在了??
小渔儿 发表于 2010-12-23 10:48


那个问题是我问的, 当然同时我也是高手 ..所以我来为你解惑.

事实很简单, getopts就是这么设计的, 下面的问题是问什么要这样设计? 举个例子:

egrep命令有个选项-f, 后面需要以文件名作为参数. 假设存在文件testf, 那么

egrep -f testf  一切正常, 不会报错, 但是:

egrep -f -i 就会报错: egrep: can't open -i

显然这里-i仍然被识别为-f的参数而不是另一个选项.

这样设计的目的是出于灵活性的考虑, 如果getopts强制将所有的-x都视为option的话, 那有时候参数本身也可能是-x的形式该怎么办呢? 比如上面这个例子, 文件名本身也可能是-x形式, 虽然在实际应用中很罕见.

如果你想在你的应用中将所有的-x都视为option,那只能添加自己的逻辑来实现.

论坛徽章:
0
8 [报告]
发表于 2010-12-23 11:21 |只看该作者
if [[ $2 != $OPTARG ]]

    echo "need an arg!"

else
   
    xxoo.....

论坛徽章:
0
9 [报告]
发表于 2010-12-23 11:23 |只看该作者
喔。是这样的,我主要是看了顶楼的那篇英文资料想问的,看来我理解错了那篇文章的意思
原文中这句
The builtin "getopts" doesn't get fooled: the "-b" is the argument to c, but it doesn't think that b is set also.
这句话是什么意思?
我以为getopts可以直接可以避免这种问题的~
谢谢

论坛徽章:
0
10 [报告]
发表于 2010-12-23 11:43 |只看该作者
那个文章是说getopt ( not shell builtin)在设计上有缺陷, 在下面这种情况下犯糊涂了, foo -b -c 被解释为: -c是option -b的argument, 同时-c再次被识别为另一个option (可笑否?)

而getopts不会这样, -c就简单的被识别为-b的参数.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP