실행시간을 확인해서 1시간이 넘으면 오류를 반환하려고 하는데, 코드가 간헐적으로 오탐지를 반환하고 있습니다. 나는 firstRun.sh
시간을 다음과 같이 읽었습니다.
export START_H=`date +%H`
export START_M=`date +%m`
그리고 secondRun.sh
제가 확인한 당시에는 다음과 같습니다.
CURRENT_H=`date +%H`
CURRENT_M=`date +%M`
TIME=`expr $CURRENT_H - $START_H`
if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
echo "boot time is more than an hour"
fi
문제가 어디에 있는지 알아내는 데 도움을 줄 수 있는 사람이 있나요? if 문에서 사용하는 것과 사용하는 것 &&
사이에 차이점이 있습니까 ? -a
아니면 []
와 를 사용하는 것의 차이점은 무엇입니까 ()
?
답변1
export BOOT_TIME=$(date +%s)
current=$(date +%s)
(( current - BOOT_TIME >3600 )) && echo "More than an hour"
%s
1970-01-01 00:00:00 UTC 이후의 초 수를 반환합니다.
토론: 초가 더 좋은 이유
예를 들어 시작(부팅) 시간이 23:00이고 현재 시간이 00:23이라고 가정합니다. 음수의 경우 $TIME
에는 작동하지 않습니다.
if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
echo "boot time is more than an hour"
fi
마찬가지로 시작 시간은 12:03이고 현재 시간은 14:00이라고 가정합니다. 그런데 이번에는 미세한 테스트 때문에 위의 방법도 작동하지 않았습니다.
답변2
여기에는 두 가지 질문이 있습니다.
별도의 명령문에서 현재 시간의 시간과 분을 설정할 때 잠재적인 경쟁 조건이 있습니다(시간 위에 이동하는 분이 고려됨).
첫 번째 스크립트 조각에서는
%m
몇 분을 사용합니다(그러나 실제로는 몇 달입니다). 두 번째에는%M
.
내 제안은 HHMM=$(date +'%H %M')
두 부분으로 나누는 것이 낫다는 것입니다. 더 나은 방법은 시간을 epoch 이후의 결합된 초 값으로 처리 SECONDS=$(date --utc +'%s')
하고 각 시간에 3600초를 포함하도록 허용하는 것입니다. (이 --utc
섹션에서는 1년에 두 번 현지 시간이 변경되는 것을 방지합니다.)