"getopts"を使用したBash機能は、最初の実行時にのみ機能します。

f私は以下に基づいてBashで関数を定義しました:ここの例(「パラメータのあるオプション」の下):

f () {
  while getopts ":a:" opt; do
    case $opt in
      a)
        echo "-a was triggered, Parameter: $OPTARG" >&2
        ;;
      \?)
        echo "Invalid option: -$OPTARG" >&2
        return 1
        ;;
      :)
        echo "Option -$OPTARG requires an argument." >&2
        return 1
        ;;
    esac
  done
}

彼らはスクリプトを使用していますが、私はシェルから直接関数を定義します。

Bashを初めて起動して次の関数を定義すると、すべてがうまく機能f -a 123します-a was triggered, Parameter: 123。しかし、同じ行を2番目に実行すると、何も印刷されません

この動作の原因は何ですか? Bash 3.2と4.3で発生しますが、Zsh 5.1ではうまく動作します。この例はZshではなくBashのものなので、これは驚くべきことです。

ベストアンサー1

bashはオプションを取得します環境変数の使用選択トレース処理の最後のオプションパラメーター。実際には、OPTIND同じシェルセッション内で呼び出されるたびに自動的にリセットされず、シェルが呼び出されたときgetoptsにのみリセットされます。したがって、getopts同じパラメータを使用して同じセッションで2回目に呼び出すと、何も変更されず、OPTIND操作がgetopts完了したと考え、何もしません。

OPTIND正しく動作するように手動でリセットできます。

$ OPTIND=1
$ f -a 123
-a was triggered, Parameter: 123

あるいは、関数をスクリプトに入れてスクリプトを複数回呼び出すだけです。


zshはオプションを取得します少し違う。OPTIND通常、シェル関数が終了するたびに1にリセットされます。

おすすめ記事