`shift $(($OPTIND -1))` で Shift コマンドを使用します。

`shift $(($OPTIND -1))` で Shift コマンドを使用します。

投稿を見ました。シェルコマンドの移動説明。そこにはコメントできないので、Shiftコマンドの使い方を知りたいです。これは、Shiftを使用した後にスクリプトに渡されたパラメータが空であることを意味しますか?このコマンドの利点は何ですか

答え1

その結果、空の引数のリストが生成される場合とそうでない場合があります。これは、開始されたパラメーターの数とgetopts見つかった($ OPTINDに設定されている)関連パラメーターの数によって異なります。 getoptsは、で始まらないすべての引数を無視し、-後続の--引数をオプションとして処理するのをやめるようにgetoptsに指示しますrm -f -- -filenamebeginningwith-.txt

たとえば、5つのargsがある場合、-x -y -z file1 file2最初のshift 33つのargsは削除され、argsだけが残りますfile1 file2

答え2

このコマンドを使用する理由は、shift $((OPTIND -1))解析されたオプションを「スキップし」、さらにgetopts処理するためにファイルタイプパラメータを維持するためです。

これは$OPTIND、シェルの組み込みコマンドによって管理されるシェル変数です。getoptsシェルの起動時は$OPTIND1 に等しく、getoptsオプションまたはオプション引数を取得するために呼び出しが行われるたびにインクリメントされます。

shift現在のパラメータリストの先頭から必要な数のパラメータを削除します。

  • この呼び出しは、shift 3シェルの引数リストから最初の3つの引数を元に戻せないように削除します。

答え3

デフォルトでは、「shift」コマンドを使用すると、スクリプトまたは関数に渡された引数を「参照」できます。

主な用途は、引数がなくなるまで「移動」しながらループ内の$ 0にアクセスすることです。

Shift $(($OPTIND-1)) の正確な使用法は、getopts の解析と正規化オプションをスキップすることです (つまり、-uvh は -u -v -h になります)。したがって、これは最初の「非オプション」を取得します。パラメータはパラメータ配列の$ 0位置にあります。

答え4

デモでは、次のことを説明できます。

$ set -- 1 2 3 4 5 6  # set the positional parameter $1, $2, ...
$ echo "$@"   # print the positional params
1 2 3 4 5 6
$ shift 3
$ echo "$@"
4 5 6

今、[ $1 -eq 4 ] && [ $2 -eq 5 ] && [ $3 -eq 6 ]

関連情報