Tengo un script que dice así:
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
Y mi problema es que a veces, incluso si el tiempo de ejecución es menor que el tiempo de espera, falla la prueba <
Aquí hay un resultado de la última ejecución:
Delay exceeded
Run_Time 4
Wait_Time 30
Respuesta1
Intente ejecutar este fragmento de código:
if [[ 5 < 20 ]]
then
echo "5 < 20, as expected"
else
echo "5 is not less than 20, but why?"
fi
Y el resultado sería 5 is not less than 20, but why?
. La respuesta es que estás usando el <
operador de expresión condicional, que está documentado como:
cadena1 < cadena2 Verdadero si cadena1 ordena lexicográficamente antes de cadena2 en la configuración regional actual.
Y su problema es que "20" está lexicográficamente (o, básicamente, alfabéticamente) antes de "5".
Estas buscando:
if (( $Run_Time < $Wait_Time ))
en cambio, esto utiliza una evaluación aritmética y una aritmética menor que, que es lo que necesita.