レポートのために先月の情報を収集するスクリプトを作成しています。
これまで、次のような変数があります。
#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
月や日数を必要に応じて追加または減算できます。月数を十分減算すると前年に戻ります。