Bashスクリプトでループを作成する方法

Bashスクリプトでループを作成する方法

私は次のスクリプトを書いた。 udevによって呼び出されます。外部USBハードドライブを接続すると、スクリプトはボリュームがtruecryptとしてマウントされていることを確認し、そうでない場合はマウントし、マウントされている場合はフォルダ内のすべてのファイルを外部ハードドライブにコピーします。コピーが完了したら、ボリュームがまだtruecryptによってマウントされていることを確認してください。そうであれば削除しようとし、そうでなければ私に電子メールを送ります。

私が実装したいのは、ボリュームがマウントされていることを再帰的に確認する方法です。つまり、ボリュームがまだマウントされている場合は、ボリュームがマウントされていないことを確認し、電子メールが送信されるまでマウント解除を試みる必要があります。

より明確に言えば、Windows cmdではGOTOタグを使用しますが、Linux bashにはGOTOはありません。

#!/bin/sh
# 
############ Parameters ############
from="from"
dest="dest"
smtp="smtp"
username="username"
pass="pass"
message="Sync to hard disk 1TB completed. You shall now remove the external hard drive."
subject="Sync to hard disk 1TB completed."
file="/media/truecrypt2/sync/dummy.file"
sendanemail="sendEmail -f $from -t $dest -u $subject -s $smtp -xu $username -xp $pass -m $message"
############ End Parameters ############

sleep 4
touch $file

if [ -f $file ];
then
   cp /storage/sdf1/folder/*.txt /media/truecrypt2/sync/ -n -r
   cp /storage/sdf1/folder/*.jpg /media/truecrypt2/sync/ -n -r
else
   echo "truecryptpassword" | truecrypt /dev/sdj1 /media/truecrypt2 -t -k="" --protect-hidden=no -p=""
   cp /storage/sdf1/folder/*.txt /media/truecrypt2/sync/ -n -r
   cp /storage/sdf1/folder/*.jpg /media/truecrypt2/sync/ -n -r
fi

sleep 4

if [ -f $file ]
then
   truecrypt -d /dev/sdj1
   if [ -f $file ]
   then
     truecrypt -d /dev/sdj1
   else
     $sendanemail
   fi
else
   $sendanemail
fi

ベストアンサー1

while true; do
   if [ -f $file ]; then
       truecrypt -d /dev/sdj1
       break
   fi
       $sendanemail
       sleep n # change n to number of seconds to pause 
done

ループは、ステートメントの実行が完了するwhileまで永久に実行され続けます。 trueと評価するbreakと、[ -f $file ]対応するコードブロックが実行され、breakループが終了します。それ以外の場合は$sendemail実行され、sleep nループが再開されます。

おすすめ記事