実行時間を確認して1時間を超えるとエラーを返そうとしますが、コードが断続的に誤検出を返しています。firstRun.sh
私は時間を次のように読みました。
export START_H=`date +%H`
export START_M=`date +%m`
そして、secondRun.sh
私が確認したときは、次のようになります。
CURRENT_H=`date +%H`
CURRENT_M=`date +%M`
TIME=`expr $CURRENT_H - $START_H`
if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
echo "boot time is more than an hour"
fi
問題がどこにあるかを調べるのに役立つ人はいますか? if文で使用するものと使用するもの&&
に違いはありますか?-a
それとも[]
との使用の違いは何ですか()
?
答え1
export BOOT_TIME=$(date +%s)
current=$(date +%s)
(( current - BOOT_TIME >3600 )) && echo "More than an hour"
%s
1970-01-01 00:00:00 UTC 以降の秒数を返します。
ディスカッション:蝋燭が良い理由
たとえば、開始(ブート)時間が23:00で現在時刻が00:23であるとします。負の場合$TIME
は機能しません。
if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
echo "boot time is more than an hour"
fi
同様に、開始時刻は12:03で、現在時刻は14:00であると仮定します。ところで今回は微細なテストのため、上記の方法も動作しませんでした。
答え2
ここには2つの質問があります。
別のステートメントで現在の時間と分を設定すると、潜在的な競合状態があります(時間の上に移動する分が考慮されます)。
最初のスクリプトスニペットでは
%m
数分を使用します(実際は数ヶ月です)。第二に%M
、 。
私の提案は、HHMM=$(date +'%H %M')
2つの部分に分けるのが良いことです。より良い方法は、時間をエポック以降の結合された秒値として処理SECONDS=$(date --utc +'%s')
し、各時間に3600秒を含めることを可能にすることです。 (この--utc
セクションでは、年に2回現地時間が変わることを防ぎます。)