do whileループを使用してLinuxから特定の値を返す

do whileループを使用してLinuxから特定の値を返す

ファイルが更新されていることを確認するスクリプトを作成しようとしています。その時点でファイルが更新された場合、スクリプトは何もしませんが、ファイルの更新が停止した場合、スクリプトはいくつかの追加ステートメントを返す必要があります。

これまで、次のスクリプトがあります。

#!/bin/bash

DIR=/home/

cd $DIR

FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)

while [ ${FILE} -eq 1 ]
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
if [ ${FILE} -eq 0 ]
then
    echo "Job is finished"
fi

デフォルトでは、私のホームディレクトリから1分以内に更新されたtest.logというファイルを探しています。ファイルが存在することを示すために、wc -lを使用しています。 test.logファイルが存在する場合は、whileループを使用して「20秒間スリープモードに切り替える」という文を返したいと思います。ファイルが更新されなくなったら、スクリプトを続行して「作業完了」を返したいと思います。

このとき、test.logファイルがないときにスクリプトを実行すると、Job is doneが返されます。ただし、test.logファイルが存在し、「1分前」以下の場合、スクリプトは「現在20秒間待機中」を返し、ファイルが1分より古く更新されていない場合でもこの情報を返し続けます。これ以上。スクリプトは引き続き「タスク完了」を返しません。

ベストアンサー1

ループ内で変数を変更しないのでFILE(同じまま)、すぐに完了するか無限ループに入ります。

あなたのLinuxシステムにこのstatコマンドがあるとし、次のことを試してください。

while (( ( $(printf "%(%s)T") - $(stat -c"%Y" test.log) ) < 60 ))
  do    echo "Now sleeping for 20 seconds"
        sleep 20
  done

2つの時間値を簡単に減算するために、合計とエポック形式bashの機能を利用してください。ファイルが1分以内に変更されると、ファイルが1分より古いまで繰り返されます。%()T((...))stat

おすすめ記事