bashとBourneShellの日付計算とかshUnit2のメモ
最近シェルスクリプトを書いていたのですが、環境を勘違いしてbashで書いていました…
bash動くと思ってたけど動かなかった\(^o^)/普通のBourne Shellだったか。。。
— Takehito Amanumaさん (@tenten0213) 9月 4, 2012
bashと普通のBourneShellで日付の計算方法に違いがあったのでメモをしておこうと思います。
bash
1日前を表示する
$ date -d '1 day ago' +%Y%m%d
結果
20120904
"ago" をつけないと1日後を表示(ちなみにdayでもdaysでもOK)
monthやyearも使えます。
$ date -d '1 days' +%Y%m%d
結果
20120906
shell(BourneShell)
1日前を表示する
日本時間は世界標準時間 GMT (≒UTC) より9時間早いので、
JST-9が現在時刻となる。
1日前を表示するには24を足し、以下のコマンドとなる。
※前を表示するのにプラスする点に注意!
$ env TZ=JST+15 date +%Y%m%d
結果
20120904
1日後を表示(未来だとマイナスする)
$ env TZ=JST-33 date +%Y%m%d
結果
20120906
shUnit2
久々にシェルを書いてて、テスティングフレームワークとか無いかなーって探したらあったので使ってみました。
shUnit2 は Bourne ベースのシェルスクリプト用の xUnit ユニット(単体)テストフレームワークであり、JUnit や PyUnit などと同様の手法で動作するように設計されています。 シェルスクリプトの単体テストを書きたいと思ったことがあるならば、shUnit2 が実現してくれます。
shUnit2 2.1.x ドキュメント - Pac Learner
shUnit2をダウンロードしてくると、サンプルとして以下のコードが入っています。(他にもいくつか)
結構簡単に使えますね。
#! /bin/sh # file: examples/equality_test.sh testEquality() { assertEquals 1 1 } # load shunit2 . ../src/shell/shunit2
テスト用の関数もassertや、fail、setUp、tearDownなど各種揃っていて便利です。
日付計算をbashの形式で書いていましたがテストを書いていたおかげで、上記のBourneShellの記述に修正するだけで切り抜けられましたとさ。