回答:
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)。