次のスクリプトがあります。
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
答え1
次のコードを実行してみてください。
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?
使用していることです。<
文字列1 <文字列2 現在のロケールでは、string1がアルファベット順にstring2の前にある場合はtrueです。
問題は、アルファベット順に「20」が「5」の前に出てくるということです。
あなたが探している:
if (( $Run_Time < $Wait_Time ))
代わりに、これは算術評価と算術lessを使用します。これがまさにあなたに必要なものです。