타임스탬프를 비교하는 while 루프

타임스탬프를 비교하는 while 루프

일련의 타임스탬프를 생성하고 최대 한도와 비교하고 싶습니다. 이것을 확인하기 위해 while 루프를 사용하고 싶습니다.

여기 내 코드가 있습니다.

start_ts='2021-08-07 15:00:00'
end_ts='2021-08-10 05:00:00'

while [ "$start_ts" > "$end_ts" ]
do 
  echo $start_ts
    start_ts=$(date -ud "$start_ts +0 + 30 minutes" +'%Y-%m-%d %H:%M:%S')
done

$end_ts그러나 그 사이클은 가치에서 멈추지 않고 계속됩니다 .

내가 뭐 놓친 거 없니?

답변1

[ ... ]따옴표 없이 와 함께 사용하면 >리디렉션 연산자입니다. 이는 이제 명령 출력을 파일로 리디렉션하여 생성된 2021-08-10 05:00:00현재 디렉터리에 이름이 지정된 파일이 있을 수 있음을 의미합니다.[

주문하다

[ "$start_ts" > "$end_ts" ]

다음과 같이 쓸 수도 있습니다.

[ "$start_ts" ] >"$end_ts"

(예를 들어이 명령은 어떻게 적법합니까? "> 파일 1 < 파일 2 고양이"). 이는 문자열이 "$start_ts"비어 있지 않은지 확인하는 테스트이며, 이 테스트의 출력(아무것도 [출력되지 않으므로 아무 것도 아님)이 file 로 리디렉션됩니다 $end_ts.

함께 사용하는 [[ ... ]]경우>문자열 비교 연산자두 문자열이 특정 방식으로 정렬되었는지 테스트합니다. 이것이 아마도 여러분이 사용하고 싶은 것이지만 올바른 논리를 얻으려면 을 사용 <하거나 매개변수를 바꾸 거나 대신 >사용할 수 있습니다 .untilwhile


또 다른 접근 방식은 문자열 비교를 완전히 건너뛰고 대신 Unix 타임스탬프의 정수 비교를 사용하는 것입니다.

start_ts=$( date -d '2021-08-07 15:00:00' +%s )
end_ts=$( date -d '2021-08-10 05:00:00' +%s )

while [ "$start_ts" -lt "$end_ts" ]; do 
    printf '%(%Y-%m-%d %H:%M:%S)T\n' "$start_ts"
    start_ts=$(( start_ts + 1800 ))
done

date루프 내부에는 GNU 호출이 없기 때문에 원래 코드보다 몇 배 더 빠르게 실행됩니다(내 시스템에서는 약 50배 더 ​​빠릅니다).

관련 정보