- blogs:
- cles::blog
2013/11/20

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


プログラムをひとつひとつ起動して、いくつかのテストケースを標準出力に放り込むという作業をひたすらやるという一種のルーチン作業を毎週こなしているのですが、いい加減面倒になってきたので 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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(114471)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112984)
3 . 年次の人間ドックへ(112407)
4 . 2023 年分の確定申告完了!(1つめ)(111975)
5 . 三菱鉛筆がラミーを買収(111846)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112984)
3 . 年次の人間ドックへ(112407)
4 . 2023 年分の確定申告完了!(1つめ)(111975)
5 . 三菱鉛筆がラミーを買収(111846)
cles::blogについて
Referrers