현재 날짜로부터 분기의 첫 번째 날과 마지막 날을 계산해야 하는 쉘 스크립트를 작성 중입니다. 이는 스크립트 내에서 트리거되는 Ingres 10 SQL 문에 적용됩니다. Ingres는 ksh를 사용하여 Solaris 서버에서 실행됩니다.
그래서 오늘이 2017년 1월 31일이라면 다음과 같이 계산하고 싶습니다.
- 이번 분기의 첫 번째 날짜(2017년 1월 1일)
- 이번 분기의 마지막 날짜(2017년 3월 31일)입니다. 필요한 경우 독점 날짜를 여기에 반환할 수 있습니다(예: 01/04/17).
- 직전 분기의 첫 번째 날짜(01/10/16)
- 이전 분기의 마지막 날짜(2016년 12월 31일)입니다. 2017년 1월 1일의 독점 결과도 제공됩니다.
누구든지 도와줄 수 있나요? 분기 번호를 얻는 것과 관련된 문제를 본 적이 있지만 실제로는 도움이 되지 않습니다.
다음을 시도했지만 변수가 Case 문에 채워지지 않았기 때문에 작동하지 않습니다.
CURR_MONTH=`date +%m`
echo "Current month num = $CURR_MONTH"
CURR_YEAR=`date +%Y`
echo "Current year = $CURR_YEAR"
let "LAST_YEAR = $CURR_YEAR - 1"
echo "Last year = $LAST_YEAR"
case $CURR_MONTH in
05) CURR_Q_FROM = 01.04.${CURR_YEAR}
CURR_Q_TO = "30.06.${CURR_YEAR}"
PREV_Q_FROM = "01.01.${CURR_YEAR}"
PREV_Q_TO = "31.03.${CURR_YEAR}" ;;
esac
echo "Current Q From = $CURR_Q_FROM"
echo "Current Q To = $CURR_Q_TO"
echo "Prev Q From = $PREV_Q_FROM"
echo "Prev Q To = $PREV_Q_TO"
나는 다음과 같은 결과를 얻습니다.
Current month num = 05
Current year = 2017
Last year = 2016
Month to be extracted = April 2017
./stats_report_monthly.sh[85]: CURR_Q_FROM: not found
./stats_report_monthly.sh[86]: CURR_Q_TO: not found
./stats_report_monthly.sh[87]: PREV_Q_FROM: not found
./stats_report_monthly.sh[88]: PREV_Q_TO: not found
Current Q From =
Current Q To =
Prev Q From =
Prev Q To =
답변1
사용 ksh93
( /bin/sh
Solaris 11에서도 마찬가지):
#! /usr/bin/ksh -
eval "$(printf '%(y=%Y m=%-m)T')"
first=$(printf '%(%F)T' "$y-$(((m-1)/3*3+1))-1")
last=$(printf '%(%F)T' "$first next 2 months last day")
echo "$first $last"
first2=$(printf '%(%F)T' "$first last 3 months")
last2=$(printf '%(%F)T' "$first2 next 2 months last day")
echo "$first2 $last2"
예:
$ ./quarter
2017-04-01 2017-06-30
2017-01-01 2017-03-31
$ faketime 2017-01-31 ./quarter
2017-01-01 2017-03-31
2016-10-01 2016-12-31
다음과 같은 방법을 사용하십시오.
eval "$(date +'y=%Y m=%m')"
case $m in
(0[1-3])
echo "$y-01-01 $y-03-31"
echo "$((y-1))-10-01 $((y-1))-12-31";;
(0[4-6])
echo "$y-04-01 $y-06-30"
echo "$y-01-01 $y-03-31";;
(0[7-9])
echo "$y-07-01 $y-09-30"
echo "$y-04-01 $y-06-30";;
(*)
echo "$y-10-01 $y-12-31"
echo "$y-07-01 $y-09-30"
esac
그럼에도 불구하고 Bourne과 유사한 쉘에서 변수 할당을 위한 구문은 다음과 같습니다.
var=value
양쪽에 공백이 없습니다 =
.