投稿を見ました。シェルコマンドの移動説明。そこにはコメントできないので、Shiftコマンドの使い方を知りたいです。これは、Shiftを使用した後にスクリプトに渡されたパラメータが空であることを意味しますか?このコマンドの利点は何ですか
答え1
その結果、空の引数のリストが生成される場合とそうでない場合があります。これは、開始されたパラメーターの数とgetopts
見つかった($ OPTINDに設定されている)関連パラメーターの数によって異なります。 getoptsは、で始まらないすべての引数を無視し、-
後続の--
引数をオプションとして処理するのをやめるようにgetoptsに指示しますrm -f -- -filenamebeginningwith-.txt
。
たとえば、5つのargsがある場合、-x -y -z file1 file2
最初のshift 3
3つのargsは削除され、argsだけが残りますfile1 file2
。
答え2
このコマンドを使用する理由は、shift $((OPTIND -1))
解析されたオプションを「スキップし」、さらにgetopts
処理するためにファイルタイプパラメータを維持するためです。
これは$OPTIND
、シェルの組み込みコマンドによって管理されるシェル変数です。getopts
シェルの起動時は$OPTIND
1 に等しく、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 ]