在#!/bin/bash 中。Unix命令获取一个月中第一个工作日的日期

Him*_*ima 9 shell date

我正在寻找一个直接的 Unix 命令来获得下个月的第一个星期日、下个月的第一个星期一、下个月的第一个星期二、下个月的第一个星期三等等。

  1. 我需要完整的日期格式(时间不是强制性的)

  2. 我可以得到 2、3、4 等数字。因为我不想要数字,所以我需要日期格式(包括日、月、年)

    $ NEXT_MONTH=`date +'%m %Y' -d 'next month'`
    $ echo $NEXT_MONTH
    04 2017
    
    $ NEXT_SUNDAY=`cal $NEXT_MONTH | awk 'NF==7 && !/^Su/{print $1;exit}'`
    $ echo $NEXT_SUNDAY
    2
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我需要这些日期来发送电子邮件组的通知。

例如:我可以得到下个月的第一个星期六,如下所示。

$ firstofmonth=$(date -d '+1 months' '+%Y%m01')
20170401

$ firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$((7 - \
                $(date -d "$firstofmonth" '+%u')     ))    
2017-04-1
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 12

ksh93

$ printf '%(%F)T\n' 'next month, first Monday'
2017-04-03
Run Code Online (Sandbox Code Playgroud)

bash,因为 4.2 现在%(<format>)T在其printfbuitin 中支持 a ,但不支持解析这种日期表达式。

如果您必须使用bash并想使用它%(<format>)T,您仍然可以在不使用以下内容的情况下进行分叉:

printf -v code '%(
  t=$((%s + (12 - %-H) * 60 * 60))
  increment=$((8 - %u))
  current_month=%m)T' -1
eval "$code"
until
  t=$((t + increment * 24 * 60 * 60)) # next Monday around mid-day
  printf -v code '%(date=%F month=%m)T' "$t"
  eval "$code"
  [ "$month" != "$current_month" ] # until be get to next month
do
  increment=7 # the first increment is the number of days
              # til Monday. Next increments are just a week.
done
echo "$date"
Run Code Online (Sandbox Code Playgroud)


par*_*ark 10

假设 GNU date(因为-d您正在使用自己)和一个类似zshshell 的{1..7}

$ for i in {1..7} ; do \
    LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
  done | awk '/Mon/ {print $1}'
2017-04-03
Run Code Online (Sandbox Code Playgroud)

将 替换awk Mon为所需的任何工作日(用于LC_ALL=C获取英文月份名称,而不管用户的语言环境如何)。此外,如果您将重新查询一周中的每一天,则将其存储到变量中可能会更好:

$ days=$(for i in {1..7} ; do \
           LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
         done)

$ for i in Mon Tue Wed Thu Fri Sat Sun ; do \
    echo "${days}" | awk "/${i}/"'{print $1}' ; \
  done
2017-04-03
2017-04-04
2017-04-05
2017-04-06
2017-04-07
2017-04-01
2017-04-02
Run Code Online (Sandbox Code Playgroud)