나는 1개월(20170301 - 20170331) 동안만 스크립트를 활성화하기 위해 이 루프를 만들었습니다.
for ((i = 20170301; i<=20170331; i++)) ; do /home/jul/exp/prod/client/apps/scripts/runCer client-layer-name $i; done
그런데 5개월(20170301~20170831) 동안 실행하고 싶은데 어떻게 해야 하나요?
답변1
GNU를 date
사용할 수 있다고 가정하면 다음 // 스크립트를 사용할 수 있습니다 bash
.ksh93
zsh
start=$(date -ud 20170301 "+%s") # start time in epoch time (seconds since Jan. 1st, 1970)
end=$(date -ud 20170831 "+%s") # end time
for ((i=start; i <= end; i+=86400)); do # 86400 is 24 hours
runCerclient-layer-name "$(date -ud "@$i" +%Y%m%d)"
done
답변2
루프는 20170301부터 시작하여 5*30일 동안 실행됩니다.
for (( i=0; i <= 150; ++i )); do
thedate=$( date -d "20170301 + $i days" "+%Y%m%d" )
printf 'The date is "%s"\n' "$thedate"
done
하지만 그렇다고 해서 20170831이 되는 것은 아니므로...
이는 날짜부터 시작하여 특정 종료 날짜에 도달할 때까지입니다.
startdate='20170301'
thedate=$startdate
for (( i=0; thedate != 20170831; ++i )); do
thedate=$( date -d "$startdate + $i days" "+%Y%m%d" )
printf 'The date is "%s"\n' "$thedate"
done
시작 날짜를 가져와 해당 날짜로부터 5개월 후의 종료 날짜를 계산한 후 다음을 반복합니다.
startdate='20170301'
enddate=$( date -d "$startdate + 5 months" "+%Y%m%d" )
thedate=$startdate
for (( i=0; thedate != enddate; ++i )); do
thedate=$( date -d "$startdate + $i days" "+%Y%m%d" )
printf 'The date is "%s"\n' "$thedate"
done
이는 GNU 및 , 또는 와 같은 쉘을 가정합니다 date
.bash
ksh93
zsh
답변3
dateseq
(때때로 dseq
또는 라고도 함 dateutils.dseq
) 이 있습니다 dateutils
.
dateseq -{i,f}%Y%m%d 20170301 20170831
for ((...))
이 구문( ksh93
(어디에서 왔는지) 및 )을 지원하는 zsh
3개의 셸 중 bash
두 셸에는 서로 다른 방식이기는 하지만 이를 기본적으로 지원하는 기능이 있습니다.
크쉬 93
for ((i = 20170301; i<=20170831; i=$(TZ=UTC0 printf '%(%Y%m%d)T' "$i 24:00")))
do
echo "$i"
done
다루기 힘든
zmodload zsh/datetime
for ((i = 20170301; i<=20170831;)); do
echo "$i"
TZ=UTC0 strftime -rs s %Y%m%d $i
TZ=UTC0 strftime -s i %Y%m%d $((s + 86400))
done
세게 때리다
GNU 셸은 -like printf
도 지원 하지만 날짜 구문 분석이 아닌 형식 지정에만 지원됩니다. 그러나 GNU는 일반적으로 사용 가능한 모든 곳에서 사용할 수 있으며 이에 대한 몇 가지 답변이 제공되었습니다.ksh93
%T
bash
date
date
비지박스나 BSD와 같은 다른 구현에도 이 기능이 있지만 구문이 다릅니다.
다른 대안으로는 GNU awk
또는 perl
.