BLOGTIMES
2013/11/20

bash で超簡易なテストドライバを書く

  sh  testing 
このエントリーをはてなブックマークに追加

プログラムをひとつひとつ起動して、いくつかのテストケースを標準出力に放り込むという作業をひたすらやるという一種のルーチン作業を毎週こなしているのですが、いい加減面倒になってきたので bash を使って少し自動化することにしました。今回はあまり時間もかけられないので bash で簡単なスクリプトを組んで済ますことにしました。

汎用化することを考えると、1つのテストケースがテキスト1行に対応すると分かりやすいので、read を使ってファイルを1行ずつ読んでプログラムの標準入力に放り込むことにします。というわけで、下記のようなコードを書いてみました。これで単純なケースではうまく行ったのですが、問題は下記のようにテストケースの途中に改行が入っていたりするとうまく動かないこと。

test.sh

#!/bin/bash while read line ; do echo -e "$line" | awk '{print NR,$0}' echo "---" done <<EOT aaa\nbbb\nccc ddd\neee\nfff ggg\nhhh\niii jjj\nkkk\nlll EOT

どうやら read が \ をメタキャラクタだと解釈してまうのが問題のようです。

$ ./test.sh 1 aaanbbbnccc --- 1 dddneeenfff --- 1 gggnhhhniii --- 1 jjjnkkknlll ---

これまでも read は IFS を変更して TSV を解釈させたりといろいろやっていますが、ちゃんと read のマニュアルを読んだことがなかったので、この機会に bash の read リファレンスに目を通してみます。この read は bash のビルトインコマンドなので、which read としても見つかりませんし、man read とすると bash のビルトインのマニュアルが出てきます。

すぐに -r が \ をエスケープキャラクタと見なさなくなる設定だということが分かりました。

test2.sh

#!/bin/bash while read -r line ; do echo -e "$line" | awk '{print NR,$0}' echo "---" done <<EOT aaa\nbbb\nccc ddd\neee\nfff ggg\nhhh\niii jjj\nkkk\nlll EOT

これで予想どおり動くようになったので、一件落着。

$ ./test2.sh 1 aaa 2 bbb 3 ccc --- 1 ddd 2 eee 3 fff --- 1 ggg 2 hhh 3 iii --- 1 jjj 2 kkk 3 lll ---

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6285
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン