У меня есть такой сценарий:
while :
do
Start_Time=$(date +"%s")
MAIN PROGRAM GOES HERE (CROPPED TO SHORTEN THINGS)
Run_Time=$(( $(date +"%s") - $Start_Time ))
if [[ $Run_Time < $Wait_Time ]]
then
Delay_Time=$(( $Wait_Time - $Run_Time ))
sleep $Delay_Time
else
echo "Delay exceeded"
echo $Run_Time
echo $Wait_Time
fi
done
И моя проблема в том, что иногда, даже если время выполнения меньше времени ожидания, тест не проходит.
Вот результат последнего запуска:
Delay exceeded
Run_Time 4
Wait_Time 30
решение1
Попробуйте запустить этот фрагмент кода:
if [[ 5 < 20 ]]
then
echo "5 < 20, as expected"
else
echo "5 is not less than 20, but why?"
fi
И вывод будет 5 is not less than 20, but why?
. Ответ в том, что вы используете <
оператор условного выражения, который, как документировано, делает:
строка1 < строка2 Истинно, если string1 лексикографически сортируется перед string2 в текущей локали.
А ваша проблема в том, что «20» лексикографически (или, по сути, в алфавитном порядке) стоит перед «5».
Вы ищете:
if (( $Run_Time < $Wait_Time ))
вместо этого здесь используется арифметическая оценка и арифметическое «меньше», что вам и нужно.