2012-03-21 51 views
4

我想在bash中使用getopts来分析命令行参数,但我无法弄清楚如何实现“默认”行动,如果没有参数匹配(或没有cmdline参数给出)。getopts在没有cmd时打印帮助。行参数匹配

这silghtly简化的什么我试过到目前为止版本:

while getopts v:t:r:s:c: name; 
do 
     case $name in 
     v) VALIDATE=1;; 
     t) TEST=1;; 
     r) REPORT=1;; 
     s) SYNC=1;; 
     c) CLEAR=1;; 
     *) print_help; exit 2;; 
     \?) print_help; exit 2;; 
     esac 
done 

有没有(简单)的方法,使其调用print_help; 2号出口;在不匹配的输入?

回答

3

展望在你的问题和Aditya答案的评论之间,我建议如下:

[getopts]$ cat go 
#!/bin/bash 

function print_help { echo "Usage" >&2 ; } 

while getopts vtrsc name; do 
    case $name in 
     v) VALIDATE=1;; 
     t) TEST=1;; 
     r) REPORT=1;; 
     s) SYNC=1;; 
     c) CLEAR=1;; 
     ?) print_help; exit 2;; 
    esac 
done 

echo "OPTIND: $OPTIND" 
echo ${#@} 

shift $((OPTIND - 1)) 

while (("$#")); do 
    if [[ $1 == -* ]] ; then 
     echo "All opts up front, please." >&2 ; print_help ; exit 2 
    fi 
    echo $1 
    shift 
done 

因为每一个都是布尔标志选项,所以你不需要(实际上也不需要)参数,所以我们摆脱了冒号。这些字符都不在IFS中,因此我们不需要用引号包装它,它将成为getopts的一个标记。

接下来,我们改变了\?到一个?和摆脱*的,因为*将字面\?匹配之前,我们可能会在规则以及合并成一个默认的匹配。这是一件好事,因为用-前缀指定的任何选项都应该是一个选项,并且如果用户指定了一个您不期望的选项,则用户会期望程序失败。

getopts将解析第一件不是参数,并将OPTIND设置为该位置的值。在这种情况下,我们会将OPTIND - 1(因为opts是0-索引)转移到前面。然后,我们会通过将这些参数移开,回显它们或者如果它们以-开头而失败。

,并测试:

[getopts]$ ./go 
OPTIND: 1 
0 
[getopts]$ ./go -t -v go go 
OPTIND: 3 
4 
go 
go 
[getopts]$ ./go -d -v go go 
./go: illegal option -- d 
Usage 
[getopts]$ ./go -t go -v go -d 
OPTIND: 2 
5 
go 
All opts up front, please. 
Usage 
1

v:t:r:s:c:应该是基于您发布的脚本双引号

"v:t:r:s:c:" 

,也许你并不需要所有的冒号:

而且你不需要*)

+0

谢谢,有没有什么方法可以匹配'非参数',例如“./script asdf”? – AoeAoe 2012-03-21 12:35:38

+0

我不知道我的头顶。你是否使用更新后的脚本来尝试它? – 2012-03-21 12:42:18

+0

当getopts返回时,OPTIND被设置为第一个非选项参数的索引。 – 2012-03-21 12:46:50

1

你需要的,如果要启用?匹配无效选项提供的getopts的选项字符串后面紧跟一个冒号 - :vtrsc。你也不必以前?

2

反斜杠尝试以下解决方法:

# Parse the arguments. 
while getopts ':h?f:' opts; do 
    case ${opts} in 

    f) # Foo argument. 
     ;; 

    # My other arguments. 

    \? | h | *) # Prints help. 
     grep " .)\ #" $0 
     exit 0 
     ;; 
    esac 
done 

所以基本上-?/-h将打印参数与基于自身的源代码注释。在选项之前指定:也会打印任何其他未知参数的帮助。

+0

不错的利用grep。通过编写打印帮助功能节省时间。我确实需要添加“h \?”到arg列表以避免'非法选项'输出。 – 2016-01-27 16:37:45