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文字を超えるオプションがあることだけです。つまり、-pと-qの代わりに-ppppと-qqqqです。

私は自分のプログラムを書き、-helpを実装すると問題が発生します...

4

2 に答える 2

8

従来のシェルコマンドの場合、はと-help同等-h -e -l -pであるため、「-help」を解析getoptsすると、4つの別個の引数として扱われます。このため、すべての解析を自分で実行する場合を除いて、複数文字の引数の前に1つのハイフンのみを付けることはできません。慣例により、単一の文字だけではないオプション(別名「長いオプション」)の前には、明確にするために2つのダッシュが付いています。

-hヘルプテキストの規則は、との両方をサポートすること--helpです。

残念ながら、bashのgetoptsビルトインは長いオプションをサポートしていませんが、すべての一般的なLinuxディストリビューションには、getopt代わりに長いオプションをサポートする別のユーティリティがあります。

この回答には、このトピックに関する詳細な説明があります

于 2012-03-26T22:46:19.093 に答える
4

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
于 2012-03-27T03:22:57.863 に答える