web-dev-qa-db-ja.com

他の数よりも小さい数をテストする方法

次のようなスクリプトがあります。

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
2
TCZ8

このコードスニペットを実行してみてください:

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?になります。答えは、<条件式演算子を使用しているということです。これは、次のように文書化されています。

 string1 <string2 
現在のロケールでstring1がstring2の前に辞書式にソートされる場合はTrue。

そして、あなたの問題は、「20」が「5」の前に辞書式に(または基本的にアルファベット順に)あることです。

あなたが探しています:

if (( $Run_Time < $Wait_Time ))

代わりに、これは算術評価と、必要な算術未満を使用します。

12
godlygeek