2016-12-19 1 views
0

BASH를 사용하여 시작부터 종료 날짜까지 10 분 간격으로 반복하고 싶습니다. 시도했습니다.BASH 루핑 시간

begin_date="2015-01-01 00:00:00" 
end_date="2015-02-20 00:00:00" 
d=$begin_date 
while [ "$d" != "$end_date" ]; do 
    echo $d 
    d=$(date -d "${d} + 10 min" +"%Y-%m-%d %H:%M") 
done 

하지만 작동하지 않았습니다. 보고있는 사람 Bash:Looping thru dates

형식 문자열에는 무엇이 누락 되었습니까?

+0

"작동하지 않음"을 정의하십시오. 그것은 어떤 산출물을 생산합니까? – fedorqui

+0

10 분 또는 1 일을 추가하지 않았습니다. – Miles

+0

'-I'가 왜 중요한지 구체적으로 설명하는 질문에서 어쨌든 그것을 꺼 냈습니다. – tripleee

답변

1

방금 ​​연결의 예는 약간 조정해야 : 옵션 -I-d 각각 --iso-8601--date에 해당합니다

#!/bin/bash 

## User-specified dates. 
# See [GNU Coreutils: Date] for more info 
# [GNU Coreutils: Date]: https://www.gnu.org/software/coreutils/manual/html_node/Combined-date-and-time-of-day-items.html#Combined-date-and-time-of-day-items 
begin_date="2015-01-01T00:00" 
end_date="2015-01-01T00:40" 

# Run through `date` to ensure iso-8601 consistency 
startdate=$(date --iso-8601='minutes' --date="${begin_date}") 
enddate=$(date --iso-8601='minutes' --date="${end_date}") 

# Do loop 
d="$startdate" 
while [ "$d" != "$enddate" ]; do 
    echo $d 
    d=$(date --iso-8601='minutes' --date="$d + 10 minutes") 
done 

하는 것으로.

+0

감사합니다. Sigve, 답안도 작동합니다. 정확한 답을 여러 개 틱 할 수 있는지는 확실하지 않습니다. – Miles

+0

추가 테스트에서 Sigve의 대답을 받아들이겠습니다. 한 달 동안 두 가지 방법을 모두 실행했습니다. Sigve의 약간 빨랐다 사용자가 대 Sigve의 실제 0m57.308suser 0m0.953s SYS의 0m52.250s 이 그러나, 이유는 내가 대답을 변경 SYS의 0m55.953s을 0m1.156s tripleee의 실제 1m1.310s @ (별로에 의해 비록) 날짜 (이전/새 경로 (YYYYMMDD) 및 이전/새 이름 foo_HHMM)에서 파생 된 네 개의 변수가 필요하다는 것이었고 위의 코드는 날짜를 다시 형식화하기 쉬웠지만 다른 코드는 쉽지 않았습니다. – Miles

+1

시작일과 종료일에 대한 사소한 수정. Z (즉, UTC)를 사용하지 마십시오. 'code' begin_date = "2015-01-01T00 : 00" end_date = "2015-01-01T00 : 40" 'code' – Miles

2

date -d "${d} + 10 min"은 오프셋이 10 분인 날짜를 생성하지 않는 것으로 보입니다. 사실 코드를 실행하면 날짜 카운터가 뒤로 이됩니다. (이 진단 정보를 질문의 일부로 게시하면 다른 사람들이 문제의 위치를 ​​파악하는 데 도움이됩니다. 코드를 실행하기 위해 다른 사람에게 코드를 실행하도록 요구해서는 안됩니다.)

어쨌든, 정상적인 방법은 다음과 같습니다. 날짜를 Unix epoch으로 변환 한 다음 거기에서 가져옵니다.

for ((d=$(date -d "$begin_date" +%s); d <= $(date -d "$end_date" +%s); d += 600)) 
do 
    date -d @$d +"%F %H:%M" 
done 

셸에서 날짜 계산이 다소 비효율적 일 수 있습니다. 이를 예 : Awk 또는 Perl은 너무 느리거나 많은 시간을 실행해야하는 경우 시간을 투자 할 가치가 있습니다.

+0

감사합니다. 코드가 완벽하게 작동합니다. 약 8 시간 동안 그걸로 싸우고있어! 나는 당신의 대답을 이해하기 위해 구글 에포크 (time epoch) 시간을 보냈다 :-) – Miles

+0

피드백에 감사드립니다; Wikipedia 링크가 추가되었습니다. – tripleee

+0

나는 또한이 희소 한 _feature_의 시간을'+10 분'을 말할 때 거꾸로 경험했습니다. – fedorqui