
Eu tenho um script que é assim:
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
E meu problema é que às vezes mesmo que o tempo de execução seja menor que o tempo de espera ele falha no <test
Aqui está uma saída da última execução:
Delay exceeded
Run_Time 4
Wait_Time 30
Responder1
Tente executar este trecho de código:
if [[ 5 < 20 ]]
then
echo "5 < 20, as expected"
else
echo "5 is not less than 20, but why?"
fi
E a saída seria 5 is not less than 20, but why?
. A resposta é que você está usando o <
operador de expressão condicional, que está documentado como fazendo:
string1 < string2 Verdadeiro se string1 for classificado antes de string2 lexicograficamente no código do idioma atual.
E o seu problema é que “20” está lexicograficamente (ou, basicamente, em ordem alfabética) antes de “5”.
Você está procurando:
if (( $Run_Time < $Wait_Time ))
em vez disso - usa avaliação aritmética e um valor aritmético menor que, que é o que você precisa.