#!/bin/bash에 있습니다. 해당 월의 첫 번째 근무일 날짜를 가져오는 Unix 명령

#!/bin/bash에 있습니다. 해당 월의 첫 번째 근무일 날짜를 가져오는 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
    
  3. 이메일 그룹에 알림을 보내려면 이 날짜가 필요합니다.

예를 들어 아래와 같이 다음 달 첫 번째 토요일을 얻을 수 있습니다.

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

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

답변1

존재하다 ksh93:

$ printf '%(%F)T\n' 'next month, first Monday'
2017-04-03

bash%(<format>)T, 4.2는 이제 buitin에서 a를 지원 printf하지만 그러한 날짜 표현식을 구문 분석하는 기능은 지원하지 않습니다.

반드시 사용해야 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"

답변2

GNU date( -d자신의 것을 사용하고 있음)와 zsh다음과 같은 쉘을 가정합니다 {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

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

답변3

실제로 시스템에서 사용할 수 있는 경우 PHP는 텍스트 입력에서 날짜를 매우 쉽게 구문 분석할 수 있습니다.

예:

bash-[522]$ php -qr 'date_default_timezone_set("UTC"); echo date("d-m-Y\n", strtotime("first monday of next month"));'
03-04-2017

내 .bashrc에 다음 기능이 있습니다.

get_date ()
{
    text="$*";
    php -qr "date_default_timezone_set(\"UTC\"); echo date(\"d-m-Y\n\", strtotime(\"$text\"));"
}

나는 그것을 다음과 같이 사용할 수 있습니다 :

bash-[523]$ get_date first monday of next month
03-04-2017

편집하다사용할 옵션 추가cal

거의 모든 시스템 에 bash이 기능 이 있을 것입 니다 cal. 달력 프로그램. 다음과 같이 cal, 및 date의 조합을 실행하여 주의 첫 번째 날에 대한 날짜 목록을 얻을 수 있습니다 .awk

 cal -hN $(date -d 'next month' +%b' '%Y) | grep -v $(date -d 'next month' +%b) | awk -v date=$(date -d 'next month' +%Y-%m-) '{ printf "%s: "date"%02i\n", $1, $2; }'

그러면 다음과 같은 결과가 출력됩니다.

Su: 2017-04-02
Mo: 2017-04-03
Tu: 2017-04-04
We: 2017-04-05
Th: 2017-04-06
Fr: 2017-04-07
Sa: 2017-04-01

해당 월의 마지막 날짜를 가져오도록 $2awk 문을 변경하세요 .$NF

답변4

다음 달의 모든 날짜와 평일을 나열할 수 있습니다.

# for i in `seq 1 93`; do date '+%Y-%m-%d %w' -d "+$((i - 31)) days"; done | sed 's|0$|7|g' | grep `date +"%Y-%m" --date="$(date +%Y-%m-15) 1 month"`
2021-02-01 1
2021-02-02 2
2021-02-03 3
2021-02-04 4
2021-02-05 5
2021-02-06 6
2021-02-07 7
2021-02-08 1
2021-02-09 2
2021-02-10 3
2021-02-11 4
2021-02-12 5
2021-02-13 6
2021-02-14 7
2021-02-15 1
2021-02-16 2
2021-02-17 3
2021-02-18 4
2021-02-19 5
2021-02-20 6
2021-02-21 7
2021-02-22 1
2021-02-23 2
2021-02-24 3
2021-02-25 4
2021-02-26 5
2021-02-27 6
2021-02-28 7

매월 첫 번째 일요일을 얻으려면 다음을 추가하세요.| grep 7$ | head -n 1

그게 다야


주제 외: 매월 마지막 금요일을 가져옵니다.| grep 5$ | tail -n 1

주제에서 벗어남: 이번 달에 물건을 구입하고 1 month다음으로 변경하세요.0 month

관련 정보