code

Bash : 날짜 반복

codestyles 2020. 11. 26. 08:18
반응형

Bash : 날짜 반복


그런 bash 스크립트가 있습니다.

array=( '2015-01-01', '2015-01-02' )

for i in "${array[@]}"
do
    python /home/user/executeJobs.py {i} &> /home/user/${i}.log
done

이제 날짜 범위 (예 : 2015-01-01부터 2015-01-31까지)를 반복하고 싶습니다.

Bash에서 달성하는 방법?

업데이트 :

가지고 있으면 좋다 : 이전 실행이 완료되기 전에 작업을 시작해서는 안됩니다. 이 경우 executeJobs.py가 완료되면 bash 프롬프트 $가 반환됩니다.

예를 들어 wait%1내 루프에 통합 할 수 있습니까?


GNU 날짜 사용 :

d=2015-01-01
while [ "$d" != 2015-02-20 ]; do 
  echo $d
  d=$(date -I -d "$d + 1 day")
done

이것은 문자열 비교를 사용하기 때문에 엣지 날짜의 완전한 ISO 8601 표기법이 필요합니다 (선행 0을 제거하지 마십시오). 유효한 입력 데이터를 확인하고 가능한 경우 유효한 형식으로 강제 변환하려면 다음을 사용할 수도 있습니다 date.

# slightly malformed input data
input_start=2015-1-1
input_end=2015-2-23

# After this, startdate and enddate will be valid ISO 8601 dates,
# or the script will have aborted when it encountered unparseable data
# such as input_end=abcd
startdate=$(date -I -d "$input_start") || exit -1
enddate=$(date -I -d "$input_end")     || exit -1

d="$startdate"
while [ "$d" != "$enddate" ]; do 
  echo $d
  d=$(date -I -d "$d + 1 day")
done

마지막 추가 사항 : $startdate이전 $enddate인지 확인하려면 1000 년에서 9999 년 사이의 날짜 만 예상하는 경우 다음과 같이 문자열 비교를 사용하면됩니다.

while [[ "$d" < "$enddate" ]]; do

사전 식 비교가 실패 할 때 10000 년 이후 매우 안전한 편이 되려면 다음을 사용하십시오.

while [ "$(date -d "$d" +%Y%m%d)" -lt "$(date -d "$enddate" +%Y%m%d)" ]; do

이 표현 은 숫자 형식으로 $(date -d "$d" +%Y%m%d)변환 $d됩니다. 즉, 2015-02-23가됩니다 20150223. 아이디어는이 형식의 날짜를 숫자로 비교할 수 있다는 것입니다.


중괄호 확장 :

for i in 2015-01-{01..31} …

더:

for i in 2015-02-{01..28} 2015-{04,06,09,11}-{01..30} 2015-{01,03,05,07,08,10,12}-{01..31} …

증명:

$ echo 2015-02-{01..28} 2015-{04,06,09,11}-{01..30} 2015-{01,03,05,07,08,10,12}-{01..31} | wc -w
 365

압축 / 중첩 :

$ echo 2015-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} | wc -w
 365

중요한 경우 주문 :

$ x=( $(printf '%s\n' 2015-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} | sort) )
$ echo "${#x[@]}"
365

순서가 지정되지 않았기 때문에 다음과 같이 윤년을 맞출 수 있습니다.

$ echo {2015..2030}-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} {2016..2028..4}-02-29 | wc -w
5844

start='2019-01-01'
end='2019-02-01'

start=$(date -d $start +%Y%m%d)
end=$(date -d $end +%Y%m%d)

while [[ $start -le $end ]]
do
        echo $start
        start=$(date -d"$start + 1 day" +"%Y%m%d")

done

입력 날짜에서 아래의 범위로 반복하려면 사용할 수 있으며 yyyyMMdd 형식으로 출력을 인쇄합니다.

#!/bin/bash
in=2018-01-15
while [ "$in" != 2018-01-25 ]; do
  in=$(date -I -d "$in + 1 day")
  x=$(date -d "$in" +%Y%m%d)
  echo $x
done

I had the same issue and I tried some of the above answers, maybe they are ok, but none of those answers fixed on what I was trying to do, using macOS.

I was trying to iterate over dates in the past, and the following is what worked for me:

#!/bin/bash

# Get the machine date
newDate=$(date '+%m-%d-%y')

# Set a counter variable
counter=1 

# Increase the counter to get back in time
while [ "$newDate" != 06-01-18 ]; do
  echo $newDate
  newDate=$(date -v -${counter}d '+%m-%d-%y')
  counter=$((counter + 1))
done

Hope it helps.

참고URL : https://stackoverflow.com/questions/28226229/bash-looping-through-dates

반응형