![在 bash 中获取上周的数字](https://linux22.com/image/109427/%E5%9C%A8%20bash%20%E4%B8%AD%E8%8E%B7%E5%8F%96%E4%B8%8A%E5%91%A8%E7%9A%84%E6%95%B0%E5%AD%97.png)
我需要该月前一周的号码。
在 3 月的第 2 周,前一周将为 1。在 4 月的第一周,前一周将为 5。
我的一周从星期一开始。
WEEK=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))
我怎样才能从中减去 1 以便得到前一周的值(如果该周等于 1 我有一个例外,所以我不必介意这一点)。
如果能自动识别只有 4 周的二月就好了。
答案1
如果我没记错的话,你的表达式(在这里稍微重新组织一下)找到对应于当月第一天的周数,对应于今天的周数,并将差值计算为每月的周数?
first=$(date -d "-$(($(date +%d)-1)) days")
weekofmon=$(( 1 + $(date +%V) - $(date -d "$first" +%V) ))
如果这是正确的,并且您想要上周的月份,那么只需将“今天”替换为“7 天前”(在所有地方)即可获得与那个日期?
now="7 days ago"
first=$(date -d "$now - $(($(date +%d -d "$now" )-1)) days")
weekofmon=$(( 1 + 10#$(date +%V -d "$now") - 10#$(date -d "$first" +%V) ))
依赖于date
能够解析“7 天前 - 3 天”等表达式。date +%V
打印周数< 10,并带有前导零,这将导致它们被解释为八进制数字,打破08
和09
。添加 来10#
强制 bash 采用十进制数字。
获取同月第一天的更短方法:
first=$(date -d "$now" +"%Y-%m-01")
(格式不同,但date
应该能够解释。)