Shell Scriptでオプションをパースするときの必勝法
κeenです。CIMの解説 実装編の執筆はもうちょい掛かりそうです。だいたいコードが落ち着いたら書きます。
今回は長いオプションと短いオプションをシェルスクリプトでパースするときの話です。
シェルスクリプトではcase
を使う方法とgetopts
を使う方法があります。case
だと長いオプションと短いオプションを扱えるものの短いオプションをまとめるのに苦労し、getopts
だと短いオプションをまとめられるものの長いオプションを扱えません。
そこで解決策。--foo ARG
-f ARG
-h
をパースし、他のオプションも許可(無視)、--
でパースを止めるとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
単純にcase
とgetopts
を組み合わせます。ポイントは-*)
の節のOPTIND=1
とgetopts
の第3引数でしょうか。
因みにこの例だと引数を消費します。引数を消費したくなければ
1 2 |
|
を
1
|
|
に書き換えれば良く、--
でパースを止めたくなければ--) break;;
の節を無くせば良く、
他のオプションを許したくなければ--*);;
の節を--*)exit 1;;
などにし、getopts
の引数文字列:f:h
の:
をとってgetopts fh ...
とすれば良いです。