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にリセットされます。