mattintosh note

どこかのエンジニアモドキの備忘録

date コマンドで「○ヶ月前」

1 month ago とか使えない date コマンドで「○ヶ月前」ってどうやって出すのかな…と。

例えば6ヶ月前の場合。(引数がなければ ${gap}-6

自分なりに考えてみたものだと JavaScript.getMonth() のように1〜12月を0〜11に変換してそれを戻すっていう感じになったんだけど他にいい方法あるのかしら?

gap=${1:--6}
set -- $(($(date +%Y) * 12 + $(date +%m) - 1))
set -- $(printf '%04d%02d' $(((${1} + ${gap}) / 12)) \
                           $(((${1} + ${gap}) % 12 + 1)))
target_date=${1}

追記

date コマンドに予め演算子と算術式用の $(()) を入れておいて eval で展開すれば date コマンドは1回で済む。

typeset -i gap
gap=${1:--6}
set -- $(
  eval printf %04d%02d $(
    date +'$(((%Y*12+%m-1+${gap})/ 12)) 
           $(((%Y*12+%m-1+${gap})%%12+1))'
    )
  )
target_date=${1}