UNIX(HPUX)で前月の最終日を取得する方法

UNIX(HPUX)で前月の最終日を取得する方法

レポートのために先月の情報を収集するスクリプトを作成しています。

これまで、次のような変数があります。

#I used an array to get the previous month. 
set -A months Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov
x=`date +%m`  
y=`expr $x - 1`
year=`date +%Y`
month=`perl -MPOSIX=strftime -le '@t = localtime; $t[3] = 1; $t[4]--;print strftime("%m", @t)'`
month_abv=`echo ${months[$y]}`

可変出力:

year=2017
month=04
month_abv=Apr

今私に必要なのは先月末だけだ。

答え1

GNUを使用して、その月の1日前日を計算できますdate

date -d "$(date +"%Y-%m-01") - 1 day" +"%F"

またはdateutils以下を使用してくださいdateadd

dateadd "$(date +"%Y-%m-01")" "-1d"

または使用するのは少し難しいですdateutils。 31番目の月の最後の日に丸められます。 (記録された行為は31日未満の月にも有効です。)

$ dateround --next today -31d
2017-04-30
$ dateround --next "2016-03-10" -31d
2016-02-29

答え2

先月の最終日を取得する方法は次のとおりです。

cal $month $year | awk 'NF {DAYS = $NF}; END {print DAYS}'

変数プレースホルダーを使用して、前月のカレンダーを取得し、その月の最後の日を印刷できます。

cal 04 2017 | awk 'NF {DAYS = $NF}; END {print DAYS}'

出力:

30

より簡単で短い方法があれば、すべての提案に開いています。

答え3

努力する:

eval "$(
  LC_ALL=C perl -MPOSIX -le '
    @t = localtime;
    $t[3]=0; # set day to 0 (day before the first)
    print strftime q(year=%Y month=%m day=%d month_abv="%b"), @t'
)"

perlいくつかのシェルコード(例year=2017 month=04 day=30 month_abv="Apr":)を設定し、evalそれを現在のシェル(POSIXシェルと仮定)に入れます。

LC_ALL=Cロケールに関係なく Month_abv を英語で強制することです。ユーザーのロケールに含めるには、削除してください。

このday=0トリックはGNU、FreeBSD、Solarisで動作しますstrftime()が、それ以外ではどのくらい移植性があるのか​​わかりません。

得るために最初先月のある日、1月に実行していたにもかかわらず、それを交換することは私$t[3]=0にとって効果的でしたが、$t[3]=1; $t[4]--もう一度移植性がどれほど良いのかわかりません。

答え4

前月を検索するには、次の手順に従ってください。

date -d "-1 months" +%Y/%-m/%-d

これはあなたに与えるでしょう2018/2/22:中2018/3/22

date -d "-1 days" +%Y/%-m/%-d

あなたに与えるでしょう:2018/3/21

月や日数を必要に応じて追加または減算できます。月数を十分減算すると前年に戻ります。

関連情報