我正在编写一个 shell 脚本,需要从当前日期计算一个季度的第一天和最后一天。这适用于从脚本内触发的 Ingres 10 SQL 语句。 Ingres 在带有 ksh 的 Solaris 服务器上运行。
所以,如果今天是 2017 年 1 月 31 日,我想计算以下内容
- 当前季度的第一个日期 (01/01/2017)
- 当前季度的最后日期 (31/03/2017)。如有必要,可以在此处返回独家日期(即 01/04/17)
- 上一季度的第一个日期 (01/10/16)
- 上一季度的最后一个日期 (31/12/2016)。 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 的 shell 中变量赋值的语法是:
var=value
两边都没有空格=
。