어떤 시간 날짜 값이 항상 특정 시간 날짜보다 큰가요?
스크립트에서는 duration
프로세스를 종료할 때까지 루프가 영원히 실행되도록 변수에 매개변수를 제공하고 싶습니다.
# `duration` has a value in seconds
end=$(($(date +%s) + duration))
while true; do
# ...
[ $(date +%s) -ge $end ] && break
# ...
done
답변1
나는 그것을 다음과 같이 바꿀 것입니다 :
SECONDS=0
while true; do
# ...
[ "$duration" = forever ] || [ "$SECONDS" -lt "$duration" ] || break
# ...
done
그리고 시스템이 지원하는 최대 개수가 얼마인지 duration=forever
걱정할 필요가 없습니다 .[
$SECONDS
매초마다 자동으로 증가합니다. 이 기능은 ksh에서 제공되며 zsh
및 에서도 사용할 수 있습니다 bash
. 그러나 벽시계 시간의 전체 초 수가 변경될 때마다 $SECONDS
in이 증가합니다. 예를 들어 12:00:00.999에 실행하면 12:00:01.000에 1로 증가합니다. 밀리초 후에.bash
SECONDS=0
다음으로 전환할 수 있는 옵션이 있는 경우 zsh
(더 이상 해당 오류가 발생하지 않음) 다음과 같이 변경할 수 있습니다.
typeset -F SECONDS=0
while true; do
# ...
(( SECONDS < duration )) || break
# ...
done
그리고 duration=inf
영원히 실행하려면 for 루프를 사용하세요. 이는 또한 부분적인 기간을 허용합니다.
답변2
답변3
날짜가 유효한 최대값을 찾는 것은 어렵지 않습니다. 어쨌든 테스트에는 64비트만 사용할 수 있습니다.
#!/bin/bash
start=${1:-50}
maxint=$(( (1<<63)-1 ))
usedate="date"
for ((n=start;n>=0;n--)); do
limit=$((1<<n))
if [[ $limit -lt 0 ]] || [[ $limit -gt $maxint ]] ; then limit=$maxint; fi
if [[ $usedate == "date" ]]; then
if endtime=$(date -d @"$((end | limit))" +'<<%s>>'); then
enderror=""
else
enderror="error reported"
fi
else
enderror=$( printf -v endtime '%(%s)T' "$((end | limit))" >/dev/null);
fi
if [ -z "$enderror" ]; then
end=$((end | limit))
fi
printf "end=%d %x\n" "$end" "$end"
done
비트 54까지는 제한이 괜찮아 보이며 결과는 다음과 같습니다.
$ ./script 54
end=36028797018963967 7fffffffffffff
그러나 일단 55를 시도하면 결과를 해석하는 데 더 오랜 시간이 걸리기 시작합니다(아마도 1년 날짜 제한일 수 있음).
$ ./script 55
end=67768036191691199 f0c2ab7c54e1bf
printf 테스트(change 스크립트에 이미 정의되어 있음 usedate
)는 최대 63비트 제한을 제공하지 않습니다(end=9223372036854775807 7ffffffffffffff).
날짜를 테스트하여 시스템의 정확한 한도를 확인할 수 있습니다.
답변4
흥미롭게도 내 시스템에서는 날짜가 20억년 전으로 거슬러 올라갑니다! :-)
유효한 범위를 찾기 위해 다음과 같은 작은 스크립트를 작성했습니다.
#!/bin/bash
printdate () { TZ=UTC0 date -d@$1 ;}
limits () { # GOOD BAD
local good=$1 bad=$2 mid
while (( ( good > bad ? good - bad : bad - good ) >1 )) ;do
(( mid = (good - bad) / 2 + bad )) # "(good+bad)/2" could overflow
printdate $mid >/dev/null 2>&1 && good=$mid || bad=$mid
done
echo $good
printdate $good
}
((MAX=(1<<63)-1))
limits 0 $MAX
limits 0 -$MAX
Results:
# limits 0 $MAX
67768036191676799
Wed Dec 31 23:59:59 UTC 2147485547
# limits 0 -$MAX
-67768040609740800
Thu Jan 1 00:00:00 UTC -2147481748