bashとBourneShellの日付計算とかshUnit2のメモ

最近シェルスクリプトを書いていたのですが、環境を勘違いしてbashで書いていました…

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の記述に修正するだけで切り抜けられましたとさ。