Bash getopts 命令

3

我正在按照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时出现了问题...

这有点类似于duplicate。无论如何,如果你想编写Java风格的选项,你可能需要自己实现它或使用其他工具,因为长选项的标准是双破折号... - tchap
2个回答

8
对于传统的shell命令,-help等同于-h -e -l -p,因此如果您使用getopts解析“-help”,它会将其视为四个单独的参数。因此,除非您想自己进行所有解析,否则无法将带有单个连字符前缀的多字母参数。按照惯例,不仅是单个字符(也称为“长选项”)的选项之前都要加上两个破折号,以使事情变得明确。

帮助文本的约定是支持-h--help两种格式。

不幸的是,bash的getopts内置不支持长选项,但在所有常见的Linux发行版中,都有一个单独的getopt实用程序可用,该实用程序支持长选项。

在此答案中有更多关于这个主题的讨论


4

Upfloor的说法是正确的。 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接