私は一度戻り値を設定したい:bashでは、リターンコードの設定方法は?それはwhileループに入るよう
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
私が先頭に$? = 1
を設定する必要があり、この作業を取得するためには、それは動作しません。
私は一度戻り値を設定したい:bashでは、リターンコードの設定方法は?それはwhileループに入るよう
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
私が先頭に$? = 1
を設定する必要があり、この作業を取得するためには、それは動作しません。
#!/bin/bash
RC=1
while [ $RC -eq 1 ]
do
#do something until it returns 0
RC=$?
done
私はあなたがwhile
ループに入る前に、失敗することが保証されているコマンドを実行することによって暗黙的にこれを行うことができると思います。
標準的なコマンドは、もちろんfalse
です。
あなたの探しているものがありますか?
#!/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
false
いつでもサブシェルにおける引数でexit
を実行することにより、任意の終了コードを設定することができる1
#!/bin/bash
false
while [ $? -eq 1 ]
do
#do something until it returns 0
done
の終了コードを返します。
$ (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回実行されることを保証します目標はです。
'$(exit 42)でなければなりません。エコー "$?" –
@ElliotChance:私の答えのドル記号は、プロンプトを表していて、現状どおりに働いていると思いますが、提案した内容もうまくいきますが、必要ではありません。 –
は完全にこの回答を受け入れるべきです! – Tony
あなたは#do something until it returns 0
戻って1または0以外の場合処理するためにuntil
を使用することができます回答の一部は、コードを書き換えるに頼る
#!/bin/bash
false
until [ $? -eq 0 ]
do
#do something until it returns 0
done
を。場合によっては、制御できない外部コードである場合もあります。
この特定の質問については、$? 1に設定しますが、$を設定する必要がある場合は?有用な唯一の答えはデニス・ウィリアムソンのものです。
新しい子を生む(だけでなく、あまり簡潔である)はありません、もう少し効率的なアプローチは、次のとおりです。
function false() { echo "$$"; return ${1:-1}; }
false 42
注:一部エコーちょうどそれが現在のプロセスで実行さを検証することがあります。
古い質問が、はるかに良い答えがあります:何かが成功するまで、あなたがループしている場合は
#!/bin/bash
until
#do something until it returns success
do
:;
done
は、その後、ちょうどことをするまでのセクションで何かをします。 do/doneセクションに入れなければならないと思っていたuntilセクションに全く同じコードを置くことができます。 do/doneセクションにコードを書き込んだり、その結果をwhileまたはuntilに戻したりする必要はありません。
ここでは、* fail *が保証されたコマンドが必要です: 'false'。 – chepner
@chepner D'oh!ありがとう、そしてもちろん固定されています。 – unwind