このコードを書いています。しかし、問題は、300秒ごとに$ fnameがループで終了すると、「Time over」が印刷されることです。ファイルが届かない場合は、1時間後に「タイムアウト」が必要ですが、300秒後に「タイムアウト」印刷が始まります。
echo "enter file name"
read fname
START=`date +%s`
while [ $(( $(date +%s) - 3600 )) -lt $START ]; do
if [ -e $fname ]
then
echo "$fname present"
break
sleep 300
else
echo "Time Over"
fi
done
ベストアンサー1
私の考えでは、あなたはかなり近いと思いますが、スクリプトのいくつかの側面は過度に複雑に見えます。
次のwhile
ループを試すことができます。
#!/bin/sh
timeout=3600
granularity=300
elapsed=0
echo "Please enter the filename"
read -r file
while [ "$elapsed" -lt "$timeout" ]
do
if [ -f "$file" ]
then
break
fi
sleep "$granularity"
elapsed=$((elapsed+granularity))
done
# Was the loop broken because the file appeared, or did it time out?
if [ -f "$file" ]
then
echo "$file has appeared"
else
echo "Time over"
fi
この値を超える$granularity
まで、毎秒ファイルが存在することを確認してください。$timeout
ファイルがすでに存在する場合、スクリプトはループから出ます。
アプローチの問題は、「タイムアウト」出力がelse
定期的に確認される分岐にあることです。ループを繰り返すたびにファイルが見つからない場合。代わりに確認してみることをお勧めします。ループ後テスト変数(スクリプトの出力date
)が範囲外(ループタイムアウトを示す)ファイルが存在する場合は、「タイムアウト」メッセージを出力するかどうかを決定します。