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
'code' 카테고리의 다른 글
thead와 tbody 사이의 간격 (0) | 2020.11.26 |
---|---|
번들의 내용을 Logcat에 인쇄 하시겠습니까? (0) | 2020.11.26 |
onAttach ()가 Fragment에서 호출되지 않았습니다. (0) | 2020.11.26 |
java.lang.RuntimeException : com.android.builder.dexing.DexArchiveMergerException : Android Studio 3.0에서 dex를 병합 할 수 없습니다. (0) | 2020.11.26 |
투명한 단일 픽셀 이미지의 최소 파일 크기 (0) | 2020.11.26 |