Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
昨天日期(最后一个工作日)的bash shell脚本_Bash_Date - Fatal编程技术网

昨天日期(最后一个工作日)的bash shell脚本

昨天日期(最后一个工作日)的bash shell脚本,bash,date,Bash,Date,我正在编写一个bash脚本,需要打印最后一个工作日的日期。例如,如果脚本在周一运行,它将打印上周五的日期 我发现这张照片是昨天的日期: date -d '1 day ago' +'%Y/%m/%d' 我也知道,我可以通过使用此语句获得一周中的某一天 date +%w 我想结合这两条语句,以便有一个小的助手脚本来打印所需的日期。逻辑是这样的(注意:它的伪代码——我从来没有写过bash脚本) 有人能帮你纠正上面的伪代码吗 (我运行的是Ubuntu 10.0.4)我使用的是Mac电脑,所以我的da

我正在编写一个bash脚本,需要打印最后一个工作日的日期。例如,如果脚本在周一运行,它将打印上周五的日期

我发现这张照片是昨天的日期:

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