So testen Sie, ob eine Zahl kleiner als eine andere Zahl ist

So testen Sie, ob eine Zahl kleiner als eine andere Zahl ist

Ich habe ein Skript, das so aussieht:

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

Und mein Problem ist, dass manchmal der <-Test fehlschlägt, selbst wenn die Laufzeit kürzer als die Wartezeit ist

Hier ist eine Ausgabe des letzten Laufs:

Delay exceeded
Run_Time 4
Wait_Time 30

Antwort1

Versuchen Sie, diesen Codeausschnitt auszuführen:

if [[ 5 < 20 ]]
then
    echo "5 < 20, as expected"
else
    echo "5 is not less than 20, but why?"
fi

Und die Ausgabe wäre 5 is not less than 20, but why?. Die Antwort ist, dass Sie den Operator für bedingte Ausdrücke verwenden <, der wie folgt dokumentiert ist:

       Zeichenfolge1 < Zeichenfolge2
              Wahr, wenn string1 im aktuellen Gebietsschema lexikografisch vor string2 sortiert wird.

Und Ihr Problem ist, dass „20“ lexikografisch (oder im Grunde alphabetisch) vor „5“ steht.

Du schaust nach:

if (( $Run_Time < $Wait_Time ))

Stattdessen wird eine arithmetische Auswertung und ein arithmetisches Kleiner-als-Zeichen verwendet, was Sie benötigen.

verwandte Informationen