主な問題は、date --date オプションが利用できず、それをインストールする権限がない場合に発生します。次に、以下を試してください -
Previous month
#cal -3|awk 'NR==1{print toupper(substr($1,1,3))"-"$2}'
DEC-2016
Current month
#cal -3|awk 'NR==1{print toupper(substr($3,1,3))"-"$4}'
JAN-2017
Next month
#cal -3|awk 'NR==1{print toupper(substr($5,1,3))"-"$6}'
FEB-2017
問題は date
はあなたのリクエストを文字通り受け取り、9 月 31 日の日付 (10 月 31 日から 1 か月を引いたもの) を使用しようとしますが、それが存在しないため、存在する翌日に移動します。 date
ドキュメント (info date
から) ) には次のアドバイスがあります:
単位のあいまいさは、相対アイテムで問題を引き起こす可能性があります。たとえば、2003-06-31 は無効な日付であるため、「2003-07-31 -1 month」は 2003-07-01 と評価される可能性があります。前月をより確実に判断するには、当月の 15 日前の月を求めることができます。例:
$ date -R
Thu, 31 Jul 2003 13:02:39 -0700
$ date --date='-1 month' +'Last month was %B?'
Last month was July?
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
Last month was June!
MacOS 環境で日付を使用している場合は、これを試してください:
ST1:~ ejf$ date
Mon Feb 20 21:55:48 CST 2017
ST1:~ ejf$ date -v-1m +%m
01
ST1:~ ejf$ date -v+1m +%m
03
また、各月の 1 日に前月と翌月を計算することをお勧めします。これにより、30/31 または 28/29 (2 月/2 月のうるう年) で終わる月の問題が発生しなくなります。
次のようにします:
date -d "$(date +%Y-%m-1) -1 month" +%-m
date -d "$(date +%Y-%m-1) 0 month" +%-m
date -d "$(date +%Y-%m-1) 1 month" +%-m
または必要に応じて:
LAST_MONTH=`date -d "$(date +%Y-%m-1) -1 month" +%-m`
NEXT_MONTH=`date -d "$(date +%Y-%m-1) 1 month" +%-m`
THIS_MONTH=`date -d "$(date +%Y-%m-1) 0 month" +%-m`
あなたは 9,10,11 のような出力を要求したので、%-m
を使用しました
%m
(なし -) は 09 のような出力を生成します... (先行ゼロ)
これも 12 か月以上/未満で機能します:
date -d "$(date +%Y-%m-1) -13 month" +%-m
試してみてください
date -d "$(date +%Y-%m-1) -13 month"
完全な結果を見る