getopts OPTINDの仕組み

getopts OPTINDの仕組み

OPTIND私はそれがどのように機能するのか理解したいと思いますgetopts。最初のいくつかの位置パラメータをスキップするにはどうすればよいですかOPTIND

また、OPTINDは自動的にリセットされないため、getoptsへの複数の呼び出し間で手動で正確にリセットする方法を知る必要があります。

これは、最初の呼び出しで報告されたエラーを受け取ったためです。

gopi -z
/usr/local/bin/bash: option requires an argument -- z

ただし、2回目の呼び出しでエラーは報告されませんでした。

gopi -z

これは機能です

 gopi ()
 {

  local parg=""
  while (( $# > 0 )); do
    parg="$1"
    case $parg in
     ("-s"|"--silent") opstring=":n:z:" ;;
     (*) break ;;
    esac  # case ends here
    shift 1
  done
 
  while getopts "$opstring" opname; do
   case ${opname} in
     ("n") dothis ;;
     ("z") dothat ;;
     (?)
       ## Invalid Option Found
       echo "Invalid option: -$OPTARG" 1>&2
       exit 1
       ;;
     (:)
       ## Required option argument not found
       echo "Option -$OPTARG requires an argument" 1>&2
       exit 1
       ;;
   esac
  done
 }

ベストアンサー1

また、OPTINDは自動的にリセットされないため、getoptsへの複数の呼び出し間で手動で正確にリセットする方法を知る必要があります。

Bashのマニュアルページには次のように記載されています(getopts説明の下)。

OPTINDシェルまたはシェルスクリプトが呼び出されるたびに1に初期化されます。

これはリセットが機能し1なければならないことを意味します。これは、POSIXの説明でより明確に説明されています。getopts:

アプリケーションが設定されている場合選択値1の場合、新しいパラメータセット(現在の場所パラメータまたは新しい引数値)を使用できます。単一シェル実行環境ですべての呼び出しで同じでない引数 (位置引数または引数オペランド) を使用して getopts を複数回呼び出そうとする他のすべての試行、または次のように getopts を複数回呼び出そう選択値を 1 以外の値に変更すると、未指定の結果が生成されます。

ここで、2番目の呼び出しではfoo最初の引数が欠落していますが、-a最後の呼び出しではfoo両方の引数が再び表示されます。

foo() {
    echo --
    while getopts abc opt; do
        echo $opt
    done
}
foo -abc
foo -a -b
OPTIND=1
foo -a -b

OPTIND=1もちろん、呼び出す前に関数の先頭に設定する方が合理的ですgetopts


研究された値はあまり役に立ちませんOPTIND。これは、個々のコマンドライン引数内の場所に関する情報を含まないため、完全な真実ではありません。たとえば、上記の最初の呼び出しでパラメータを使用して-abcループ内に1、1、2の値を取ると、現在の文字位置は表示されません。 (Bashとkshでは、関数入力時にZshがリセットされるように見えますが、yashは値の引数内の位置をエンコードします。)fooOPTINDOPTINDOPTIND

おすすめ記事