レポートに使用する前月の情報を収集するスクリプトを作成しています。
これまでのところ、私は以下の変数を持っています:
#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
今必要なのは前月の最終日だけです。
前月の最終日を取得する方法は次のとおりです。
cal $month $year | awk 'NF {DAYS = $NF}; END {print DAYS}'
変数のプレースホルダーを使用して、前月のカレンダーを取得し、月の最終日を印刷できます。
cal 04 2017 | awk 'NF {DAYS = $NF}; END {print DAYS}'
出力:
30
より簡単な方法またはより短い方法があれば、私はすべての提案を受け入れます。
GNU date
を使用して、今月の最初の日の1日前を計算できます:
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
試してください:
_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
uateします(POSIXシェルを想定)。
_LC_ALL=C
_は、ロケールに関係なく、month_abvを強制的に英語にします。ユーザーのロケールにしたい場合は削除してください。
その_day=0
_トリックは、GNU、FreeBSD、およびSolarisのstrftime()
で機能しますが、それ以外の移植性はわかりません。
先月のfirst日を取得するには、_$t[3]=0
_を_$t[3]=1; $t[4]--
_に置き換えます。です。
以下は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"
前月を検索するには、次の手順に従います。
date -d "-1 months" +%Y/%-m/%-d
これはあなたに与えます:2018/2/22
ながら2018/3/22
。
date -d "-1 days" +%Y/%-m/%-d
あなたに与える:2018/3/21
何ヶ月または何日でも好きなだけ加算または減算できます。十分な月数を引くと、去年に行きます。