あなたの質問と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