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.