回答:
shift $((OPTIND-1))
(注OPTIND
は大文字です)は通常、getopts
while
ループの直後に見つかります。$OPTIND
はで見つかったオプションの数ですgetopts
。
pauljohn32がコメントで言及しているように、厳密に言えば、次のコマンドライン引数のOPTIND
位置を示します。
GNU Bashリファレンスマニュアルから:
getopts optstring名[引数]
getopts
シェルスクリプトが位置パラメータを解析するために使用します。optstring
認識されるオプション文字が含まれています。文字の後にコロンが続く場合、オプションには引数が必要です。引数は空白で区切る必要があります。コロン( ':')および疑問符( '?')はオプション文字として使用できません。呼び出されるたびgetopts
に、シェル変数名に次のオプションを配置し、name
存在しない場合は初期化し、変数に処理される次の引数のインデックスを設定しますOPTIND
。OPTIND
シェルまたはシェルスクリプトが呼び出されるたびに1に初期化されます。オプションに引数が必要な場合、getoptsはその引数を変数に入れますOPTARG
。シェルはリセットされませんOPTIND
自動的に;getopts
パラメータの新しいセットを使用する場合は、同じシェル呼び出し内への複数の呼び出し間で手動でリセットする必要が あります。オプションの終わりに
getopts
達すると、ゼロより大きい戻り値で終了します。OPTIND
最初の非オプション引数のインデックスに設定され、名前は「?」に設定されます。
getopts
通常、位置パラメータを解析しますが、でさらに引数が指定されているargs
場合、getopts
代わりにそれらを解析します。
shift
n
は、位置パラメータリストからn個の文字列を削除します。したがってshift $((OPTIND-1))
、解析されたすべてのオプションをgetopts
パラメーターリストから削除します。したがって、その時点以降$1
、スクリプトに渡された最初の非オプション引数を参照します。
更新
mikeservがコメントで言及しているように、shift $((OPTIND-1))
安全ではない可能性があります。不要な単語分割などを防ぐには、すべてのパラメータ展開を二重引用符で囲む必要があります。したがって、コマンドの安全な形式は
shift "$((OPTIND-1))"
find
)は、非オプションの後にオプションを許可するように見えますが、許可しません。ダッシュで始まるオペランドがあります。
IFS
ですが、後悔するよりは安全である方が良いです。;)
IFS=0123456789
、shift $((OPTIND-1))
(引用符なし)に変わりますshift ""
これは黙って無視(中されますksh
)、または(でエラーが発生bash
してdash
)。