昨天日期(最后一个工作日)的bash shell脚本
我正在编写一个bash脚本,需要打印最后一个工作日的日期。例如,如果脚本在周一运行,它将打印上周五的日期 我发现这张照片是昨天的日期:昨天日期(最后一个工作日)的bash shell脚本,bash,date,Bash,Date,我正在编写一个bash脚本,需要打印最后一个工作日的日期。例如,如果脚本在周一运行,它将打印上周五的日期 我发现这张照片是昨天的日期: date -d '1 day ago' +'%Y/%m/%d' 我也知道,我可以通过使用此语句获得一周中的某一天 date +%w 我想结合这两条语句,以便有一个小的助手脚本来打印所需的日期。逻辑是这样的(注意:它的伪代码——我从来没有写过bash脚本) 有人能帮你纠正上面的伪代码吗 (我运行的是Ubuntu 10.0.4)我使用的是Mac电脑,所以我的da
date -d '1 day ago' +'%Y/%m/%d'
我也知道,我可以通过使用此语句获得一周中的某一天
date +%w
我想结合这两条语句,以便有一个小的助手脚本来打印所需的日期。逻辑是这样的(注意:它的伪代码——我从来没有写过bash脚本)
有人能帮你纠正上面的伪代码吗
(我运行的是Ubuntu 10.0.4)我使用的是Mac电脑,所以我的
date
命令与您的-d
标记似乎不一样,但如果它的行为与您所指示的一样,那么以下命令应该可以工作:
if [[ $(date +%w) == 1 ]]
then
LOOK_BACK=3
else
LOOK_BACK=1
fi
date -d "${LOOK_BACK} day ago" +%Y/%m/%d
你是如此接近:
day_or_week=`date +%w`
if [ $day_or_week == 1 ] ; then
look_back=3
else
look_back=1
fi
date -d "$look_back day ago" +'%Y/%m/%d'
对于OSX(在10.9.2和10.13.4上进行了测试),所以可能是使用BSD date的任何环境
if [ $(date +%w) == 1 ] ; then
date -v-3d +'%Y/%m/%d'
else
date -v-1d +'%Y/%m/%d'
fi
您可以按日期检查是否正在使用BSD
$ man date | grep "BSD General"
星期天也需要检查
DAY_OF_WEEK=`date +%w`
if [ $DAY_OF_WEEK = 0 ] ; then
LOOK_BACK=2
elif [ $DAY_OF_WEEK = 1 ] ; then
LOOK_BACK=3
else
LOOK_BACK=1
fi
date -d "$LOOK_BACK day ago" +'%Y/%m/%d'
使用bash内联“三元”表达式的更简洁形式:
[[ $(date +%w) == 1 ]] && days=3 || days=1
date -d "$days day ago" +"%Y-%m-%d"
综合其他答案,我得出了以下结论:
last_workday() {
from_date="${@:-today}"
day_of_week=$(date +%w --date="${from_date}")
if [ ${day_of_week} = "0" ] ; then
look_back=2
elif [ ${day_of_week} = "1" ] ; then
look_back=3
else
look_back=1
fi
date -d "${from_date} - ${look_back} day" +'%Y/%m/%d'
}
next_workday() {
from_date="${@:-today}"
day_of_week=$(date +%w --date="${from_date}")
if [ ${day_of_week} = "5" ] ; then
look_forward=3
elif [ ${day_of_week} = "6" ] ; then
look_forward=2
else
look_back=1
fi
date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}
for i in $(seq 16); do
now=$(date +'%Y/%m/%d' --date="today + ${i} day")
prev=$(last_workday "${now}")
next=$(next_workday "${now}")
echo "${now}: ${prev} ${next}"
done
我试着去,但我看不出它有什么理由在那里。。。在你的任何一个例子中。
date
命令已写入标准输出。你使用它是有原因的吗?@Carl:echo只是为了显示计算的日期-即为了调试目的。@ahonnecke-它在Mac OS X上从来没有工作过。你的意思是什么?我误解了,我以为你的答案是针对Mac的。按照惯例,环境变量(路径、编辑器、SHELL等)和内部SHELL变量(BASH_版本,随机,…)是完全大写的。所有其他变量名都应该是小写的。由于变量名区分大小写,此约定避免意外重写环境和内部变量。我认为有一个拼写错误:$day_或_week应该是$day_of_week,对吗?这是一个重要的补充,可能是公认的答案。
last_workday() {
from_date="${@:-today}"
day_of_week=$(date +%w --date="${from_date}")
if [ ${day_of_week} = "0" ] ; then
look_back=2
elif [ ${day_of_week} = "1" ] ; then
look_back=3
else
look_back=1
fi
date -d "${from_date} - ${look_back} day" +'%Y/%m/%d'
}
next_workday() {
from_date="${@:-today}"
day_of_week=$(date +%w --date="${from_date}")
if [ ${day_of_week} = "5" ] ; then
look_forward=3
elif [ ${day_of_week} = "6" ] ; then
look_forward=2
else
look_back=1
fi
date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}
for i in $(seq 16); do
now=$(date +'%Y/%m/%d' --date="today + ${i} day")
prev=$(last_workday "${now}")
next=$(next_workday "${now}")
echo "${now}: ${prev} ${next}"
done