在 UNIX BASH 中计算上一个季度末的月份和年份



我是Unix的新手,需要帮助计算UNIX Bash中上一个季度末的月份和年份

例如:- 如果今天的日期是2021-05-11,则需要032021输出(2021 年 3 月) 如果今天的日期是2021-01-31,则输出需要为 122020 (Dec2020)

我确实尝试了案例陈述,并且正在按预期工作。

m=$(date +%m)
y=$(date +%Y)
if [ $m -ge 1 -a $m -le 3 ]; then
prev_qtr_mon=12
prev_qtr_yr=`expr $y - 1`
elif [ $m -ge 4 -a $m -le 6 ]; then
prev_qtr_mon=03
prev_qtr_yr=$y
elif [ $m -ge 7 -a $m -le 9 ]; then
prev_qtr_mon=06
prev_qtr_yr=$y
elif [ $m -ge 10 -a $m -le 12 ]; then
prev_qtr_mon=09
prev_qtr_yr=$y
fi
echo ${prev_qtr_mon}
echo ${prev_qtr_yr}
acct_dt=${prev_qtr_mon}${prev_qtr_yr}
echo ${acct_dt}

有没有一种有效的方法来实现这一目标,而不是大案例陈述?你能帮忙吗?

我认为这更多的是一个关于数学的问题,而不是关于编程的问题。如果您的月份存储在m上,如示例代码所示,则语句

((quartnum=M/4))

给你一个从 0 到 3quartnum的数字,其中 0 是第一季度,3 是最后一个季度。这是 m 实际所在的季度。

然后上一季度少一个或多 3 个(取决于你喜欢如何看待它),你必须在年度边界进行环绕。我会做 +3 而不是 -1 以避免负数的模计算:

((prevquartnum=(quartnum+3)%4))

要将季度映射到一个月,您可以使用一个不太优雅但简单的表格:

quartmonth=(3 6 9 12) 

这说明第一季度(即prevquartnum 0)与三月相关,第二季度与六月相关,依此类推。您现在可以按${quartmonth[$prevquartnum]}获得所需的月份

我会用一个简单的if来处理年份:如果m是 3 或更小,你必须从年份中减去 1。否则,它只是当年。

我会用算术表达式(如((m >= 1 && m <= 3)))重写它以提高可读性并保持原样 - 它清晰、可读、易于维护、没有错误。我还要添加错误处理。不要使用expr- 使用$((...))。更喜欢$(..)而不是反引号"..."。使用 https://shellcheck.net 检查您的脚本。除了风格问题,我会保持原样。

你可以这样写:

if ((m <= 3)); then
prev_qtr_mon=12
prev_qtr_yr=$((y - 1))
elif ((m <= 6)); then
prev_qtr_mon=03
prev_qtr_yr=$y
elif ((m <= 9)); then
prev_qtr_mon=06
prev_qtr_yr=$y
elif ((m <= 12)); then
prev_qtr_mon=09
prev_qtr_yr=$y
fi

如果你知道m <= something不成立,这意味着你知道m > somethingm >= something + 1,因为m是一个整数。

无论如何:将表达式对齐到边界3是通过加3 - 1和除以乘以3来完成的 - 研究如何在 C 语言中做"ALIGN_UP",这是完全相同的方法。至于prev_qtr_yr,这是一个简单的 if - 我使用了<=等于以下10的结果。

prev_qtr_mon=$( printf "%02d" "$(( tmp=(m + 2)/3*3, tmp?tmp*3:12 ))" )
prev_qtr_yr=$(( y - (m <= 3) ))

最新更新