web-dev-qa-db-ja.com

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

今必要なのは前月の最終日だけです。

5

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

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

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

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

出力:

30

より簡単な方法またはより短い方法があれば、私はすべての提案を受け入れます。

2

GNU dateを使用して、今月の最初の日の1日前を計算できます:

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

またはdateutilsdateaddを使用:

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
5
rudimeier

試してください:

_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"_など)を作成し、現在のシェルにevaluateします(POSIXシェルを想定)。

_LC_ALL=C_は、ロケールに関係なく、month_abvを強制的に英語にします。ユーザーのロケールにしたい場合は削除してください。

その_day=0_トリックは、GNU、FreeBSD、およびSolarisのstrftime()で機能しますが、それ以外の移植性はわかりません。

先月のfirst日を取得するには、_$t[3]=0_を_$t[3]=1; $t[4]--_に置き換えます。です。

2

以下はksh88で私にとってはうまくいくようです(これについての支援をしてくれたStéphaneChazelasに感謝します)

#! /bin/ksh
eval "$(date +'y=%Y m=%m')"
echo "Current month = $m"
echo "Current year = $y"

#get previous month (and year of previous month)
if [[ $((m-1)) -gt 0 ]]
then
    p_m=$((m-1))
    p_m_y=$((y))
else
    p_m=12
    p_m_y=$((y-1))
fi
echo "p_m = $p_m"
echo "p_m_y = $p_m_y"

#get first/last day of previous month
p_m_from=01.${p_m}.${p_m_y}
p_m_to=$(cal $p_m $p_m_Y | grep -v ^$ | tail -1 | sed 's/^.* \([0-9]*\)$/\1/').${p_m}.${p_m_y}
echo "Previous month runs from $p_m_from to $p_m_to"
2
Ben Hamilton

前月を検索するには、次の手順に従います。

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

これはあなたに与えます:2018/2/22ながら2018/3/22

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

あなたに与える:2018/3/21

何ヶ月または何日でも好きなだけ加算または減算できます。十分な月数を引くと、去年に行きます。

0
Rashid khan