我需要创建三个变量,每个变量用于今天日期的Year,Month和Day,减去X天数。对于这个问题,我会选择一个随机的天数:222。
因此,如果:
TodayYear=`date +%Y` TodayMonth=`date +%m` TodayDay=`date +%d`
我想要的是在这之前的222天。
222days_before_TodayYear=??? 222days_before_TodayMonth=??? 222days_before_TodayDay=???
编辑:需要222个工作日,而不是222个常规日。
对于GNU日期:
date_222days_before_TodayYear=$(date --date="222 days ago" +"%Y") date_222days_before_TodayMonth=$(date --date="222 days ago" +"%m") date_222days_before_TodayDay=$(date --date="222 days ago" +"%d")
对于BSD date ::
如果您使用的是OS X或FreeBSD,请使用以下代码,因为BSD日期与GNU日期不同:
date_222days_before_TodayYear=$(date -j -v-222d +"%Y") date_222days_before_TodayMonth=$(date -j -v-222d +"%m") date_222days_before_TodayDay=$(date -j -v-222d +"%d")
资料来源:BSD date manual page
注意:
在bash和许多其他语言中,您无法使用数字字符启动变量名称,因此我为您添加了date_。
第二次更新:新要求 – 使用222个工作日而不是222个常规日:
(假设:不考虑法定假日,因为这远远超出了我可以帮助你的shell脚本的范围:)
考虑222个工作日:
>每周5个工作日,即楼(222/5)== 44周
> 44周*每周7天== 308天
>额外的日子剩余:222%5 == 2
>因此222个工作日== 310常规日
但是,有一个抓住!如果常规日数是308或7的倍数,那么我们会很好,因为从工作日起7天前的任何倍数仍然是一个工作日。所以我们需要考虑今天是星期一还是周二:
>如果今天是星期一,星期六我们将在星期六到达
>如果今天是星期二,我们星期天到星期天去
所以,如果今天是星期一或星期二,我们需要额外的2天的抵消;所以让我们先来看看,然后再继续:
#!/bin/bash # Use 310 days as offset instead of 222 offset=310 # Find locale's abbreviated weekday name (e.g.,Sun) today=$(date -j +"%a") # Check for Mon/Tue if [[ "$today" == "Mon" ]] || [[ "$today" == "Tue" ]]; then offset=$((offset+2)) fi date_222_working_days_before_TodayYear=$(date -j -v-${offset}d +"%Y") date_222_working_days_before_TodayMonth=$(date -j -v-${offset}d +"%m") date_222_working_days_before_TodayDay=$(date -j -v-${offset}d +"%d")
而且应该这样做=)