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

答え2

永久に繰り返されるwhileループとbreakファイルが見つからない場合は、ループを使用できます。find冗長検査のためにループ内でコマンドを移動する必要があります。

#!/bin/bash

while true; do
    logfile=$(find /home -maxdepth 1 -type f -mmin -1 -name 'test.log')

    if [ -z "$logfile" ]; then
      break # no file found, break while-loop
    fi
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

答え3

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

find割り当てが行われると、ここでコマンド置換が拡張されて開始されます。他は変更しないため、FILEスクリプトの起動時に得られた値は保持されます。ループ内でコマンドの置き換えと割り当てを移動します。

答え4

@Freddyのソリューションを少し改善しました。

#!/bin/bash

while find /home -maxdepth 1 -type f -mmin -1 -name 'test.log' | grep -q .
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

このソリューションは、greps-qスイッチを使用してgrepの一般的な出力(findnull / not-null条件テストの出力)を抑制します。コマンドが少なくとも1行のテキストを出力する限り、ループはwhile繰り返されます。ファイルが1分より長くなると、find出力が生成されなくなり、コマンドが失敗してループが終了します。test.logfindgrep

関連情報