免费注册 查看新帖 |

Chinaunix

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

getopt的bug? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-26 18:41 |只看该作者 |倒序浏览
getopt分析命令行输入选项的时候,如果仅仅使用了long option,那么还需要给getopt指定-o '',否则getopt分析不到命令行输入

$getopt -l hello -- '--hello'
--
$getopt -l hello -o '' -- '--hello'
--hello --

论坛徽章:
0
2 [报告]
发表于 2008-12-26 21:50 |只看该作者
看看 man里怎么说,如果有说明就不能说是bug吧?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
3 [报告]
发表于 2008-12-28 02:49 |只看该作者
原帖由 welcome008 于 2008-12-26 21:50 发表
看看 man里怎么说,如果有说明就不能说是bug吧?

没用过getopt。man的稀里糊涂。:em11:

论坛徽章:
0
4 [报告]
发表于 2008-12-28 09:34 |只看该作者
原帖由 ynchnluiti 于 2008-12-28 02:49 发表

没用过getopt。man的稀里糊涂。:em11:

难得糊涂,偶尔糊涂一把也不错。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2008-12-28 11:49 |只看该作者
原帖由 我是DBA 于 2008-12-28 09:34 发表

难得糊涂,偶尔糊涂一把也不错。

真糊涂可不好啊

搜了一下,发现大多都是介绍内置的getopts

论坛徽章:
0
6 [报告]
发表于 2008-12-29 10:06 |只看该作者
man里似乎没有提到这个

getopt功能要比getopts强,getopts不支持long option...

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2008-12-29 10:48 |只看该作者

回复 #6 prc 的帖子

两个都不支持,getopt只是把--当结果处理的标志而已

论坛徽章:
0
8 [报告]
发表于 2008-12-29 15:16 |只看该作者
原帖由 waker 于 2008-12-29 10:48 发表
两个都不支持,getopt只是把--当结果处理的标志而已

getopt不支持long option?似乎不是这样吧...

论坛徽章:
0
9 [报告]
发表于 2008-12-29 15:20 |只看该作者
看ABS介绍 getopt的时候也是一塌糊涂,看不明白

C里面有个getopt函数和getopt_long才是支持长选项的

论坛徽章:
0
10 [报告]
发表于 2008-12-29 15:36 |只看该作者

典型的getopt用法?

  1. #! /bin/bash
  2. ARGV=($(getopt -l long-option1,long-option2:,foo-foo -o 'L:' -- "$@")) || exit 1
  3. for((i=0;i<${#ARGV[@]};i++)) {
  4.     eval opt=${ARGV[$i]}
  5.     case $opt in
  6.     --long-option1)
  7.         echo "--long-option1";;
  8.     -L)
  9.         ((i++));
  10.         eval opt=${ARGV[$i]};
  11.         echo "-L $opt";
  12.         ;;
  13.     --long-option2)
  14.         ((i++));
  15.         eval opt=${ARGV[$i]};
  16.         echo "--long-option2 $opt";
  17.         ;;
  18.     --foo-foo)
  19.         echo "$opt";
  20.         ;;
  21.     --)
  22.         break;;
  23.     esac
  24. }

  25. for((i++;i<${#ARGV[@]};i++)) {
  26.     eval opt=${ARGV[$i]}
  27.     echo "  $opt"
  28. }
复制代码


1. 将getopt的结果保存到数组ARGV中,从而保留了原始的命令行输入参数。传统的做法是用set -- 覆盖命令行参数。
2. 在我的cygwin版本的getopt,使用-a选项会导致getopt产生internal error。在linux版本上则无此问题。
3. 如果仅仅接受long option,在调用getopt的时候也需要指定选项-o '',否则getopt分析的结果会产生错误。
4. 在不产生歧义的前提下,命令行输入的long option可以简写。(如上面的例子中,--foo-foo可以简写成--f。赞!!)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP