2012-05-04 6 views

答えて

8
#!/bin/bash 

RC=1 

while [ $RC -eq 1 ] 
do 

    #do something until it returns 0  

    RC=$? 
done 
4

私はあなたがwhileループに入る前に、失敗することが保証されているコマンドを実行することによって暗黙的にこれを行うことができると思います。

標準的なコマンドは、もちろんfalseです。

+0

ここでは、* fail *が保証されたコマンドが必要です: 'false'。 – chepner

+0

@chepner D'oh!ありがとう、そしてもちろん固定されています。 – unwind

1

あなたの探しているものがありますか?

#!/bin/bash 
TEMPVAR=1 
while [ $TEMPVAR -eq 1 ] 
do 
    #do something until it returns 0 
    #construct the logic which will cause TEMPVAR to be set 0 then check for it in the 
    #if statement 

    if [ yourcodehere ]; then 
    $TEMPVAR=0 
    fi 
done 
15

falseいつでもサブシェルにおける引数でexitを実行することにより、任意の終了コードを設定することができる1

#!/bin/bash 
false 
while [ $? -eq 1 ] 
do 
#do something until it returns 0  
done 
81

の終了コードを返します。

$ (exit 42); echo "$?" 
42 

だから、あなたができる:

(exit 1) # or some other value > 0 or use false as others have suggested 
while (($?)) 
do 
    # do something until it returns 0  
done 

それともできemulate a do while loop

while 
    # do some stuff 
    # do some more stuff 
    # do something until it returns 0  
do 
    continue # just let the body of the while be a no-op 
done 

それらのいずれかのループが、私は何をお使いであると信じて、少なくとも1回実行されることを保証します目標はです。

+0

'$(exit 42)でなければなりません。エコー "$?" –

+3

@ElliotChance:私の答えのドル記号は、プロンプトを表していて、現状どおりに働いていると思いますが、提案した内容もうまくいきますが、必要ではありません。 –

+0

は完全にこの回答を受け入れるべきです! – Tony

0

あなたは#do something until it returns 0戻って1または0以外の場合処理するためにuntilを使用することができます回答の一部は、コードを書き換えるに頼る

#!/bin/bash 

false 
until [ $? -eq 0 ] 
do 
#do something until it returns 0  
done 
5

を。場合によっては、制御できない外部コードである場合もあります。

この特定の質問については、$? 1に設定しますが、$を設定する必要がある場合は?有用な唯一の答えはデニス・ウィリアムソンのものです。

新しい子を生む(だけでなく、あまり簡潔である)はありません、もう少し効率的なアプローチは、次のとおりです。

function false() { echo "$$"; return ${1:-1}; } 
false 42 

注:一部エコーちょうどそれが現在のプロセスで実行さを検証することがあります。

1

古い質問が、はるかに良い答えがあります:何かが成功するまで、あなたがループしている場合は

#!/bin/bash 
until 
    #do something until it returns success 
do 
    :; 
done 

は、その後、ちょうどことをするまでのセクションで何かをします。 do/doneセクションに入れなければならないと思っていたuntilセクションに全く同じコードを置くことができます。 do/doneセクションにコードを書き込んだり、その結果をwhileまたはuntilに戻したりする必要はありません。

関連する問題