Home > 未分類

未分類 Archive

shell scriptでlong optionを処理する

仕事でシェルスクリプトを時々書く。

オプション処理にはgetoptsを使っている。
オプションの種類が増えてくると
意味が分かりやすいロングオプションが使いたいくなるが
getoptsではショートオプションしか使えないらしい。

こちらの記事や
bash によるオプション解析
こちらの記事が
bashでロングオプションとショートオプションの両方に対応する
とても参考になり、やり方を考えてみた。

環境依存なgetoptはなるべく使いたくないし
自作せずに既存の方法をなるべく使って実現したくなる。

こんな感じかなぁ。。
ポイントはロングオプションが指定されたらoptとOPTARGを書き換えて
それ以降の処理をショート/ロングオプション共通にすること。

必須のオプション引数が指定されなかった時に
エラーを表示する方法がないので自前で「check_arg_exit」を定義しておき
必要なcase節に書いておく。

全部自前の「check_arg_exit」に統一しようと思って
getoptsのオプション指定の先頭にコロンを足して
エラー表示をしないようにしたのだけど

これだとfオプションが引数無しで使われたときにcase文が?節に落ちる。
未定義のショートオプションを使った場合も?節に落ちるので
エラー表示を「オプション引数がない」にすればよいのか
「未定義のオプション」にすればいいのかわからないので諦めて
ショートオプションのエラー表示は全部getoptsに任せることにする。

(2016/10/16訂正)
man bashを読むとgetoptsは「silent」(オプション指定の先頭がコロン)なら
必須引数無は「:」、未定義オプションは「?」がoptにセットされるので区別可能。
「not silent」ならいずれも「?」がoptにセットされるらしい。
でもこのときoptが「:」や「?」になっていて
元のオプション文字はOPTARGに入っているので
自前のエラー処理と共通化できない。
ので、結局ショートオプションのエラー表示はgetoptsにお任せ。

未定義のロングオプションが指定されたら
エラー表示したいのでcase文の最後のアスタリスク節は必要。
その前の?節が無いと、未定義のショートオプションを指定した時に
getoptsからエラー表示が出てアスタリスク節でも自前のエラー表示も出てしまうので必要。

これでやりたいことは全部できてそう。
・ロングオプションを処理できる
・ロングオプションに引数指定できる
・未定義オプションでエラーを表示
・必須のオプション引数が無いときにエラー表示

あと出来てないのはこれぐらいだろうか。
私の用途ではこれらの要件は不要なので、もう満足です。
・通常引数の後にオプション指定
・引数があってもなくてもよいロングオプション

主な実行結果。

cutコマンドでデリミタ(区切り文字)の連続を1つの区切りにできない

cutコマンドでは、デリミタの連続を1つの区切りとして扱えない。

できるオプションがあるのだろうと思って調べてみたが、
どうもそういう機能はなさそうで
sedで区切り文字を1つにまとめてからcutするか、
cutじゃなくてawkを使うのが一般的の様子。

一番使うコマンドを調べるというよくある例。

確かにこれでやりたいことできるし、
awkは覚えておくといろいろ役に立つのだけど、
cutのようにただ列を抽出したいだけの用途の場合、
awk ‘print {$2}’
をタイプすることすらメンドクサイ。

mcut.shというシェルスクリプトを書いておきます。
(名前のセンスはないけど、my cut コマンド)

これで先ほどの例はこれで書ける。

ホーム > 未分類

Search
Feeds

Return to page top