【问题标题】:Bash getopts commandbash getopts 命令
【发布时间】:2012-03-26 21:40:06
【问题描述】:

我在他们的网站上关注 IBM 的示例:

(清单 #5)http://www.ibm.com/developerworks/library/l-bash-parameters/index.html

#!/bin/bash
echo "OPTIND starts at $OPTIND"
while getopts ":pq:" optname
  do
    case "$optname" in
      "p")
        echo "Option $optname is specified"
        ;;
      "q")
        echo "Option $optname has value $OPTARG"
        ;;
      "?")
        echo "Unknown option $OPTARG"
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        ;;
      *)
      # Should not occur
        echo "Unknown error while processing options"
        ;;
    esac
    echo "OPTIND is now $OPTIND"
  done

我只想拥有一个名称超过 1 个字母的选项。即 -pppp 和 -qqqq 而不是 -p 和 -q。

我已经编写了我的程序并且实施 -help 给我带来了一个问题......

【问题讨论】:

标签: bash getopts


【解决方案1】:

对于常规的 shell 命令,-help 等价于 -h -e -l -p,因此如果您使用 getopts 解析“-help”,它会将其视为四个单独的参数。因此,除非您想自己进行所有解析,否则您不能只使用一个连字符作为前缀的多字母参数。按照惯例,不只是单个字符的选项(也称为“长选项”)前面有两个破折号,以使事情明确。

帮助文本的约定是同时支持-h--help

不幸的是 bash 的 getopts 内置函数不支持长选项,但在所有常见的 Linux 发行版上都有一个单独的 getopt 实用程序可以用来代替它支持长选项。

There's more discussion of the topic in this answer

【讨论】:

    【解决方案2】:

    楼上的是对的。 getopt 实用程序支持长选项,而您可以使用 --option。也许你可以试试这个。

    #!/bin/bash
    args=`getopt -l help :pq: $*`
    for i in $args; do
        case $i in
        -p) echo "-p"
            ;;
        -q) shift;
            optarg=$1;
            echo "-q $optarg"
            ;;
        --help)
            echo "--help"
            ;;
        esac
    done
    

    【讨论】: