날짜를 a에서 b로 늘리는 방법은 무엇입니까?

날짜를 a에서 b로 늘리는 방법은 무엇입니까?

start=201909032개의 날짜 가 있고 end=20210912 시작이 거의 끝날 때까지 증분하고 싶습니다. 증분은 13일입니다.

다음 코드가 있지만 끝을 넘어갑니다.

#! /usr/bin/env bash

start="20190903"
end="20210912"

startdate="$(date -d ${start} +'%Y-%m-%d')"
enddate="$(date -d ${end} +'%Y-%m-%d')"
echo ${startdate}
echo ${enddate}

while [ "${startdate}" < "${enddate}" ]; do
    echo ${startdate}
    startdate="$( date -d "${startdate} + 13 days" +'%Y-%m-%d')"
done

답변1

startdate+interval끝과 비교 하면 재정의를 방지할 수 있습니다.

#!/bin/bash

start="20190903"
end="20210912"
interval=1123200
    # 13 days = 13 * 24 * 60 *60

startdate=$( date --utc -d ${start} +%s )
enddate=$( date --utc -d ${end} +%s )

echo "$( date --utc -d @${startdate} +"%Y-%m-%d" ) (start)"
next=${startdate}
while [[ "$(( next+interval ))" -lt "${enddate}" ]] ; do
    next=$(( next+interval ))
    nextdate=$( date --utc -d @${next} +"%Y-%m-%d" )
    echo "${nextdate}"
done
echo "$( date --utc -d @${enddate} +"%Y-%m-%d" ) (end)"

13일을 어떻게 추가했는지 잘 모르겠어서 1970-01-01부터 초로 변경했습니다. 적어도 이제 당신은 다른 방법을 알고 있습니다.

답변2

Billy 삼촌의 설명을 확장하는 것은 [일반적인 명령이므로 <표준 입력 리디렉션을 사용하고 있습니다. 오류가 발생하지 않는다면 bash: line 9: 2021-09-12: No such file or directory이전에 를 사용하고 있었을 가능성이 있습니다 >.

[ "${startdate}" < "${enddate}" ]

평가결과 및

[ "${startdate}" ]

설정되지 않았거나 비어 있지 않은 한 True입니다 $startdate. 따라서 무한 루프가 발생합니다.

[[다음과 같이 사용하도록 변경

while [[ "${startdate}" < "${enddate}" ]]; do

이는 일반 명령이 아닌 자체 구문이 있는 특수 형식이고 </ >가 리디렉션으로 구문 분석되지 않으므로 이 문제를 수정했습니다.

편집자: [[일종의 타악기입니다. POSIX와 호환 되도록 하려면 를 [사용할 수 있습니다 -lt. 그러나 사전과 달리 숫자 비교를 수행하므로 날짜 형식에서 s를 제거 <해야 합니다 .-

#!/bin/sh

startdate="20190903"
enddate="20210912"

echo ${startdate}
echo ${enddate}

while [ "${startdate}" -lt "${enddate}" ]; do
    echo ${startdate}
    startdate="$( date -d "${startdate} + 13 days" +'%Y%m%d')"
done

start귀하의 경우 이와 같이 변경하면 더 이상 /와 동일한 것이 필요하지 않으므로 더 적은 코드로 끝납니다 .startdateendenddate

편집 2: 또 다른 옵션은 escaping 인 것 같지만 <이는 [ "${startdate}" \< "${enddate}" ]bash에서만 작동하는 것 같습니다. POSIX가 아니며 적어도 zsh에서는 실패합니다.

관련 정보