보고를 위해 지난 달의 정보를 수집하는 스크립트를 만들고 있습니다.
지금까지 다음과 같은 변수가 있습니다.
#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
개월이나 일수를 원하는 대로 더하거나 뺄 수 있습니다. 개월 수를 충분히 빼면 전년도로 돌아갑니다.