일련의 타임스탬프를 생성하고 최대 한도와 비교하고 싶습니다. 이것을 확인하기 위해 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
.
함께 사용하는 [[ ... ]]
경우>
문자열 비교 연산자두 문자열이 특정 방식으로 정렬되었는지 테스트합니다. 이것이 아마도 여러분이 사용하고 싶은 것이지만 올바른 논리를 얻으려면 을 사용 <
하거나 매개변수를 바꾸 거나 대신 >
사용할 수 있습니다 .until
while
또 다른 접근 방식은 문자열 비교를 완전히 건너뛰고 대신 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배 더 빠릅니다).