2011-10-27 21 views
4

基本的に、これは私のコードです:BashシェルDo While Loop無限ループ?

bay=$(prog -some flags) 
while [ $bay = "Another instance of this program is running, please exit it first" ] 
do 
echo "Awaiting Access to program" 
do 
..... 

別のインスタンスが、それは次のことを行うキック動作しているときに私は、インスタンスが1つだけ、それは私のハードウェアと対話する方法が原因一度に実行することを可能にするプログラムを持っていますメッセージ "このプログラムの別のインスタンスが実行されています。まずは終了してください。"

私はこの同じプログラムを利用する複数のスクリプトを実行する必要があるので、私は上記のコードを使用することに決めました。私の問題は、私が2つのスクリプトを実行すると、プログラムにアクセスして必要に応じて実行するが、もう1つはエラーに気づき、「プログラムへのアクセス待ち」という無限ループで立ち往生することになる。

いくつか不足していますか?ステートメントはCLIコマンドを実行しているのか、それとも元の実行に戻って戻ってくるのでしょうか?または私の問題はどこですか?

答えて

7

ループ内のbay変数をどこかで更新していません。それは一度設定され、同じままです。毎回それを再計算する必要があります。

bayをループ内に設定するか、whileの状態に設定します。

while [ `prog -some flags` = "Another instance of this program is running, please exit it first" ] 

編集:あなたのコメントから

は、後でこの出力を参照できるようにしたいです。あなたは持っていたものに戻ることができますが、あなたのブロッキングループの内側には、bay=$(prog -some flags)コマンドをループの内側に置いてください。後で使用するためにあなたの周りに固執するでしょう。

bay=$(prog -some flags) 
while [ $bay = "Another instance of this program is running, please exit it first" ] 
do 
echo "Awaiting Access to program" 
bay=$(prog -some flags) 
done 
..... 
+0

従うならばElseステートメントで変数を呼び出すどのような方法があるだろうこの?または私はちょうど新しい変数を開始する必要がありますか? – bikerben

+0

あなたの新しい要求にアドバイスを提供するために私の回答が更新されました。 –

4

DRYより、代わりにPROGの打撃の、私が最初に何かをするユーザーを待つだろう:

while true 
do 
    bay=$(prog -some flags) 
    case "$bay" in 
    "Another instance of this program is running, please exit it first") 
     read -p "Awaiting Access to program. Close it and hit enter: " x ;; 
    *) break ;; 
    esac 
done 
echo "Results: $bay"