Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73619
  • 博文数量: 30
  • 博客积分: 2142
  • 博客等级: 大尉
  • 技术积分: 351
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 10:24
文章分类

全部博文(30)

文章存档

2011年(12)

2010年(14)

2009年(2)

2008年(2)

我的朋友

分类:

2008-12-29 13:19:11

#! /bin/bash
ARGV=($(getopt -l long-option1,long-option2:,foo-foo -o 'L:' -- "$@")) || exit 1
for((i=0;i<${#ARGV[@]};i++)) {
    eval opt=${ARGV[$i]}
    case $opt in
    --long-option1)
        echo "--long-option1";;
    -L)
        ((i++));
        eval opt=${ARGV[$i]};
        echo "-L $opt";
        ;;
    --long-option2)
        ((i++));
        eval opt=${ARGV[$i]};
        echo "--long-option2 $opt";
        ;;
    --foo-foo)
        echo "$opt";
        ;;
    --)
        break;;
    esac
}

for((i++;i<${#ARGV[@]};i++)) {
    eval opt=${ARGV[$i]}
    echo "  $opt"
}


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