OPTIND
私はそれがどのように機能するのか理解したいと思いますgetopts
。最初のいくつかの位置パラメータをスキップするにはどうすればよいですかOPTIND
?
また、OPTINDは自動的にリセットされないため、getoptsへの複数の呼び出し間で手動で正確にリセットする方法を知る必要があります。
これは、最初の呼び出しで報告されたエラーを受け取ったためです。
gopi -z
/usr/local/bin/bash: option requires an argument -- z
ただし、2回目の呼び出しでエラーは報告されませんでした。
gopi -z
これは機能です
gopi ()
{
local parg=""
while (( $# > 0 )); do
parg="$1"
case $parg in
("-s"|"--silent") opstring=":n:z:" ;;
(*) break ;;
esac # case ends here
shift 1
done
while getopts "$opstring" opname; do
case ${opname} in
("n") dothis ;;
("z") dothat ;;
(?)
## Invalid Option Found
echo "Invalid option: -$OPTARG" 1>&2
exit 1
;;
(:)
## Required option argument not found
echo "Option -$OPTARG requires an argument" 1>&2
exit 1
;;
esac
done
}
ベストアンサー1
また、OPTINDは自動的にリセットされないため、getoptsへの複数の呼び出し間で手動で正確にリセットする方法を知る必要があります。
Bashのマニュアルページには次のように記載されています(getopts
説明の下)。
OPTIND
シェルまたはシェルスクリプトが呼び出されるたびに1に初期化されます。
これはリセットが機能し1
なければならないことを意味します。これは、POSIXの説明でより明確に説明されています。getopts
:
アプリケーションが設定されている場合選択値1の場合、新しいパラメータセット(現在の場所パラメータまたは新しい引数値)を使用できます。単一シェル実行環境ですべての呼び出しで同じでない引数 (位置引数または引数オペランド) を使用して getopts を複数回呼び出そうとする他のすべての試行、または次のように getopts を複数回呼び出そう選択値を 1 以外の値に変更すると、未指定の結果が生成されます。
ここで、2番目の呼び出しではfoo
最初の引数が欠落していますが、-a
最後の呼び出しではfoo
両方の引数が再び表示されます。
foo() {
echo --
while getopts abc opt; do
echo $opt
done
}
foo -abc
foo -a -b
OPTIND=1
foo -a -b
OPTIND=1
もちろん、呼び出す前に関数の先頭に設定する方が合理的ですgetopts
。
研究された値はあまり役に立ちませんOPTIND
。これは、個々のコマンドライン引数内の場所に関する情報を含まないため、完全な真実ではありません。たとえば、上記の最初の呼び出しでパラメータを使用して-abc
ループ内に1、1、2の値を取ると、現在の文字位置は表示されません。 (Bashとkshでは、関数入力時にZshがリセットされるように見えますが、yashは値の引数内の位置をエンコードします。)foo
OPTIND
OPTIND
OPTIND