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 给了我一个问题......

4

2 回答 2

8

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

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

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

此答案中有更多关于该主题的讨论

于 2012-03-26T22:46:19.093 回答
4

楼上说的对 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
于 2012-03-27T03:22:57.863 回答