シェルコマンドの説明:shift $(($ optind-1))


30

私はLinuxの男ではありませんが、プロジェクトで読む必要のあるスクリプトに引っかかっています。だから、このコマンドが何をしているのか誰でも助けてくれますか?

shift $(($optind - 1))

3
以下に示すように、OPTINDは大文字でなければならず、括弧内の「$」はオプションです。
DarkHeart

回答:


49

shift $((OPTIND-1))(注OPTINDは大文字です)は通常、getopts whileループの直後に見つかります。$OPTINDはで見つかったオプションの数ですgetopts

pauljohn32がコメントで言及しているように、厳密に言えば、次のコマンドライン引数のOPTIND位置を示します。

GNU Bashリファレンスマニュアルから

getopts optstring名[引数]

getoptsシェルスクリプトが位置パラメータを解析するために使用します。 optstring認識されるオプション文字が含まれています。文字の後にコロンが続く場合、オプションには引数が必要です。引数は空白で区切る必要があります。コロン( ':')および疑問符( '?')はオプション文字として使用できません。呼び出されるたびgetoptsに、シェル変数名に次のオプションを配置し、name存在しない場合は初期化し、変数に処理される次の引数のインデックスを設定しますOPTINDOPTINDシェルまたはシェルスクリプトが呼び出されるたびに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))"


これは、オプションがすべて残りの位置引数の前にある場合にのみ正しく機能するようです。正しい?
スティーブヨルゲンセン

@SteveJorgensen:はい、そうです。OTOH、非オプション引数のにオプション置くと、sh / bash規則に反します。一般に、ダッシュで始まらない最初の引数はオプションの終わりを意味し、ダッシュで始まる後続の引数はオプションと見なされません。すべてのプログラムがこの規則に準拠しているわけではありませんが、そうすることで生活がずっと簡単になります。:)
PM 2Ring 16

@SteveJorgensen:(続き)このトピックについては、オプションの前にオペランドがオペランドを解析する理由について簡単に説明しています。。Celadaの回答に対するGillesのコメントにあるように、一部のプログラム(などfind)は、非オプションの後にオプションを許可するように見えますが、許可しません。ダッシュで始まるオペランドがあります。
PM 2Ring 16

その情報(および編集)に感謝します@mosvyそれはかなり珍しいことIFSですが、後悔するよりは安全である方が良いです。;)
PM 2Ring

@roaima場合IFS=0123456789shift $((OPTIND-1))(引用符なし)に変わりますshift ""これは黙って無視(中されますksh)、または(でエラーが発生bashしてdash)。
mosvy

8

$((...))ただ計算するだけです。あなたの場合、$optint1の値を取り、1を減算します。

shift定位置パラメーターを削除します。あなたの場合、optint-1パラメータを削除します。

詳細については、を見てhelp getoptshelp shift、見てman bash、「算術展開」のために、そして特にためのgoogle getopts

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.