Bash の連続ループ

Bash の連続ループ

ユーザーのメール スプール ファイルのサイズを取得するプログラムを作成したいと考えています (Linux では、スプール ファイルは /var/spool/mail/$USER にあります)。これを実行するには、30 秒ごとに実行される連続ループを作成したいと思います。ループが実行されるたびに、メール スプール ファイルのサイズが前回のループのサイズと比較されます。新しいサイズが古いサイズより大きい場合は、「新しいメールがあります」というメッセージを出力します。

下記のスクリプトを書いたのですが、うまく動作しません。何かアドバイスはありますか?

while true
do    
    clear    
    size= ls -l /var/spool | wc -c    
    sleep 30    
    newsize= ls -l /var/spool | wc -c    
    if [$size < $newsize]
    then    
            echo "You've got mail!"
    else    
            echo "Sorry no mail yet"    
    fi    
    sleep 30    
done &

答え1

bash では無限ループを使用できます。

while true ; do
    # Your code here.
    sleep 30;
done

チェックプログラムを定期的に実行するようにスケジュールすることもできます。クローン

答え2

はい、30 秒間のスリープを伴う無限ループが必要です。次のスニペットで十分です。

#!/bin/bash
while true
do
    # do any stuff you want
    echo "doing my thing"
    # sleep for 30 seconds
    sleep 30
done

しかし、これを bash スクリプトで実行するのはおそらく望んでいることではないことがすぐにわかると思います。このようなタスクには通常、何らかの形のデーモンが必要です。

修正された質問に答えるために、期待どおりに動作するスクリプトのバリエーションを次に示します。

#!/bin/bash
while true
do
    clear
    size=$(ls -l /var/spool | wc -c)
    sleep 30
    newsize=$(ls -l /var/spool | wc -c)
    if [ $size -lt $newsize ]
    then
            echo "You've got mail!"
    else
            echo "Sorry no mail yet"
    fi
    sleep 30
done

関連情報