4

bashでgetoptsを使用してコマンドライン引数を解析しようとしていますが、一致する引数がない(またはコマンドライン引数が指定されていない)場合、「デフォルト」アクションを実装する方法がわかりませんでした。

これは、私がこれまでに試したことを単純化したものです。

while getopts v:t:r:s:c: name;
do
        case $name in
        v) VALIDATE=1;;
        t) TEST=1;;
        r) REPORT=1;;
        s) SYNC=1;;
        c) CLEAR=1;;
        *) print_help; exit 2;;
        \?) print_help; exit 2;;
        esac
done

print_helpを呼び出す(簡単な)方法はありますか?出口2; 一致しない入力で?

4

4 に答える 4

6

あなたの質問とAdityaの回答に対するコメントの間を見て、私は次のことをお勧めします:

[getopts]$ cat go
#!/bin/bash

function print_help { echo "Usage" >&2 ; } 

while getopts vtrsc name; do
    case $name in
        v) VALIDATE=1;;
        t) TEST=1;;
        r) REPORT=1;;
        s) SYNC=1;;
        c) CLEAR=1;;
        ?) print_help; exit 2;;
    esac
done

echo "OPTIND: $OPTIND"
echo ${#@}

shift $((OPTIND - 1))

while (( "$#" )); do
    if [[ $1 == -* ]] ; then
        echo "All opts up front, please." >&2 ; print_help ; exit 2
    fi
    echo $1
    shift
done

これらはそれぞれブールフラグオプションであるため、引数は必要ありません(実際には必要ありません)。したがって、コロンを削除します。これらの文字はいずれもIFSに含まれていないため、引用符で囲む必要はありません。いずれにせよ、getoptsの1つのトークンになります。

次に、を\?単一に変更し、を?削除します。これは、リテラルの前に一致するため*です。ルールを組み合わせて、単一のデフォルトの一致にすることもできます。プレフィックスで指定されたオプションはすべてオプションである必要があるため、これは良いことです。ユーザーは、予期しないオプションを指定すると、プログラムが失敗することを期待します。*\?-

getopts引数ではない最初のものまで解析し、OPTINDその位置の値に設定します。この場合、OPTIND - 1(optsは0インデックスであるため)前面からシフトします。次に、これらの引数をシフトオフするか、エコーするか、。で始まる場合は失敗することで、これらの引数をループします-

そしてテストするには:

[getopts]$ ./go
OPTIND: 1
0
[getopts]$ ./go -t -v go go
OPTIND: 3
4
go
go
[getopts]$ ./go -d -v go go
./go: illegal option -- d
Usage
[getopts]$ ./go -t go -v go -d
OPTIND: 2
5
go
All opts up front, please.
Usage
于 2012-03-21T13:14:30.730 に答える
4

次の回避策を試してください。

# Parse the arguments.
while getopts ':h?f:' opts; do
  case ${opts} in

    f) # Foo argument.
      ;;

    # My other arguments.

    \? | h | *) # Prints help.
      grep " .)\ #" $0
      exit 0
      ;;
  esac
done

したがって、基本的に-?/-hは、独自のソースに基づいてコメント付きのパラメーターを出力します。オプションの前に指定:すると、他の不明な引数のヘルプも出力されます。

于 2015-12-03T23:32:52.843 に答える
2

v:t:r:s:c:二重引用符で囲む必要があります

 "v:t:r:s:c:"

投稿したスクリプトに基づくと、これらすべてのコロンは必要ないかもしれません。:

また、あなたは必要ありません*)

于 2012-03-21T12:32:26.790 に答える
1

?無効なオプションとの一致を有効にする場合は、getoptsオプション文字列に先頭のコロンを指定する必要があります- :vtrsc。また、前に円記号は必要ありません?

于 2012-03-21T13:37:22.870 に答える