読者です 読者をやめる 読者になる 読者になる

53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

本家はこちら↓
f:id:sucar:20151115183011p:plain

SU/CAR-ST-APplication-cellsの安倍野ミックスと申します
来訪ありがとうございます
シストレツールを自作してます

f:id:sucar:20150414193802p:plain

にほんブログ村 IT技術ブログ プログラム・プログラマーへ
にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村 株ブログ 株日記(アフィリなし)へ
←ランキングに
1票お願いします

awkの引数で-vオプションのありなし

awk

自作のawkスクリプトコマンドラインから、引数を渡そうと思い、ググったところ

qiita.com

で詳しく説明されていた

詳細はリンク先を見てもらえばわかるので改めて説明はしませんが簡単に書くと

  • awkで引数を渡す場合2つ方法がある
  • 1つは-vオプションを使う方法
  • もう一つは-vオプションを使わない方法
  • -vオプションを使うとちゃんとBEGINブロック内でも代入した値を参照することができる
  • -vオプションを使わないとBEGINブロック内で代入した値を参照することができない

ということで、最後に

-vオプションを使わない方法は、どのような場面で活用するんだろう... 思いつかない

で終わっている 当然

「なるほど、まあ普通-vオプション必要だよな」と思ったのだが・・・

自作awkスクリプトに引数を渡すshellスクリプトを作成したのだが、何と逆に-vオプションをつけるとうまくいかないことが発覚!

つまり、自分の設計は、あまり他人が思いつかない

-vオプションを使わない方法が活躍する場面

を無意識に想定していたのでした(やはり私は天邪鬼?)

いや、むしろ-vオプション付けない方が楽なんだけど・・・

以下、説明を試みる

-vオプションを付けると順番は以下のようになる

  1. コマンドラインでの変数への代入
  2. BEGIN{}の実行
  3. 本体の実行
  4. END{}の実行

これが、-vオプションを付けないとこうなる

  1. BEGIN{}の実行
  2. コマンドラインでの変数への代入
  3. 本体の実行
  4. END{}の実行

確かに-vオプションを付けない場合の処理の順番は変な感じである

大体、BEGIN{}の前に変数に代入されなければ、チェックすらできないではないか

うっかり代入しなかったらNULLになって・・・・

で、ここではたと気付くのである

代入しなかったらデフォルトの値を使ってくれた方がいい場合もある

BEGIN{}の中で変数にデフォルト値を入れておき、使う時にコマンドラインで変数を書き換えてやる、ってのが、-vオプションを使わない方法だとすんなりできるのだ

これが、-vオプションを使って引数を渡すと、BEGIN{}の中で変数にデフォルト値が上書き代入されてしまうので、渡しても意味がなくなる

-vオプションで渡す場合、BEGIN{}の中で変数のNULLチェックをして、NULLなら、デフォルト値を代入ってやらなければならない面倒な部分が-vオプションを使わない方法なら、BEGIN{}の中でのチェックは不要になる

awkはいろいろ奥深いですw