需要GNU日期:
today_dow=$(date +%w)
days=(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
for ((dow=0; dow<7; dow++)); do
if ((dow < today_dow)); then
date -d "last ${days[dow]}"
else
date -d "${days[dow]}"
fi
done
Sun Apr 17 00:00:00 EDT 2016
Mon Apr 18 00:00:00 EDT 2016
Tue Apr 19 00:00:00 EDT 2016
Wed Apr 20 00:00:00 EDT 2016
Thu Apr 21 00:00:00 EDT 2016
Fri Apr 22 00:00:00 EDT 2016
Sat Apr 23 00:00:00 EDT 2016
因此,我们可以这样做:
given_day_of_the_week() {
local days=(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
local today_dow=$(date +%w)
local dow datestr
for ((dow=0; dow<7; dow++)); do
if [[ "${days[dow],,}" == "${1,,}" ]]; then
if ((dow < today_dow)); then
datestr="last ${days[dow]}"
else
datestr="${days[dow]}"
fi
date -d "$datestr" "+%F"
fi
done
}
结果造成:
$ given_day_of_the_week tuesday
2016-04-19
$ given_day_of_the_week friday
2016-04-22
硬编码在工作日的名称一样,会给你的问题如果你在不同的场所
回应@ ryenus的评论:
$ given_day_of_the_week() {
local -A days=([sunday]=0 [monday]=1 [tuesday]=2 [wednesday]=3 [thursday]=4 [friday]=5 [saturday]=6)
local today_dow=$(date +%w)
local datestr=${1,,}
local dow=${days[$datestr]}
[[ -z "$dow" ]] && { echo "error: unknown day: '$1'" >&2; return 1; }
((dow < today_dow)) && datestr="last $datestr"
date -d "$datestr" "+%F"
}
$ given_day_of_the_week friday
2016-04-22
$ given_day_of_the_week monday
2016-04-18
$ given_day_of_the_week FOO
error: unknown day: 'FOO'
击不包括日期操作功能。你可以使用系统的'date'命令来做你想做的事情,但是这个命令的使用因操作系统而异,而且你没有提到你使用的是什么操作系统。另外...你有什么尝试?我们大多数人都很乐意帮助你改进自己的技艺,但不愿意担任短期无偿编程人员。在[MCVE](http://stackoverflow.com/help/mcve)中向我们展示您的工作,您期待的结果以及您获得的结果,我们将帮助您弄清楚。 – ghoti