2017-09-23 57 views
0

如果getopts中提供了多个选项并且一些需要参数而有些不需要参数,会怎么样? getopts的参数挑选下一个参数作为参数getopts参数选择下一个参数作为参数

#!/bin/bash 

while getopts ":a:b:cde:f:g:" opt; do 

case $opt in 
    a) 
    echo "-a was triggered, Parameter: $OPTARG" >&2 
    ;; 
    b) 
    echo "-b was triggered, Parameter: $OPTARG" >&2 
    ;; 
    c) 
    echo "-c was triggered, Parameter: $OPTARG" >&2 
    ;; 
    d) 
    echo "-d was triggered, Parameter: $OPTARG" >&2 
    ;; 
    e) 
    echo "-e was triggered, Parameter: $OPTARG" >&2 
    ;; 
    f) 
    echo "-w was triggered, Parameter: $OPTARG" >&2 
    ;; 
    g) 
    echo "-g was triggered, Parameter: $OPTARG" >&2 
    ;; 
    \?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 
    :) 
    echo "Option -$OPTARG requires an argument." >&2 
    exit 1 
    ;; 
esac 
done 

这里是我的问题:

$ ./hack.bash -a -b 
-a was triggered, Parameter: -b 

难道不应该显示-a缺少一个参数,而不是采取下一个选项作为参数。我在这里做错了什么?

+4

'-b'被认为是选项'-a'的一个参数,所以你看到的行为是正常的。 –

回答

0

如果一个命令行选项接受一个参数,该参数必须被提供,所以它是正确的,并预期getopts "a:b"将解析-a -b作为选项-a带有参数-b。另外,没有办法提供以短划线开头的参数。 (请记住,和其他编程语言一样,shell字符串只是普通字符的数组,字符在shell命令行中输入时引用的内容不会改变字符的内部表示形式,因此-\-是没有区别。

一些旧的命令行工具确实提供了可选的选项参数的机制。在解析参数POSIX的指导极力劝阻这种风格,但这样做的实用程序,一般早的准则。在任何情况下,指导方针只是 - 准则,而不是规则getopts不支持这种风格的参数解析,因为它被设计为在准则中工作;在某种意义上,以帮助维护它们。

长选项,其参数通常与选项名称=分开,没有此问题; --long=-a显然是一个值,而--long -a显然是--long,没有值,然后是选项-a