戻り値を一度設定して、while ループに入るようにします。
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
これを機能させるに$? = 1は、最初に設定する必要がありますが、うまくいきません。
戻り値を一度設定して、while ループに入るようにします。
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
これを機能させるに$? = 1は、最初に設定する必要がありますが、うまくいきません。
exitサブシェルで引数を指定して実行することで、任意の終了コードを設定できます。
$ (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
または、ループをエミュレートdo whileできます:
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、returnそれぞれが 256 で除算した後の整数の剰余として戻りコードを設定する整数 (正、負、またはゼロ) であるオプションの引数を受け入れます。現在のシェル (またはスクリプトまたはサブシェル*) は、およびを使用して終了しますexit。関数は を使用して終了しreturnます。
例:
$ (exit -2); echo "$?"
254
$ foo () { return 2000; }; foo; echo $?
208
* これは、パイプによって作成されたサブシェルにも当てはまります (ジョブ制御が無効でlastpipe有効になっている場合を除く)。
$ echo foo | while read -r s; do echo "$s"; exit 333; done; echo "$?"
77
ループを終了するために使用する方がよいことに注意してくださいbreak。ただし、その引数は、リターン コードではなく、ループのレベル数を表すものです。
set +m、set +o monitorまたはを使用して、ジョブ制御を無効にしshopt -u -o monitorます。有効にするにlastpipeはshopt -s laspipe. これらの両方を行うexitと、前の例の により、whileループとそれを含むシェルの両方が終了し、最後の処理echoは実行されません。
false常に終了コード 1 を返します。
#!/bin/bash
false
while [ $? -eq 1 ]
do
#do something until it returns 0
done
#!/bin/bash
RC=1
while [ $RC -eq 1 ]
do
#do something until it returns 0
RC=$?
done
一部の回答は、コードの書き直しに依存しています。場合によっては、制御できない外部コードである可能性があります。
この特定の質問については、 $? を設定するだけで十分ですが。を 1 に設定しますが、$? を設定する必要がある場合は、任意の値に - 唯一の役立つ答えは、Dennis Williamson のものです。
新しい子を生成しない (ただし簡潔ではありません) もう少し効率的な方法は次のとおりです。
function false() { echo "$$"; return ${1:-1}; }
false 42
注:エコー部分は、現在のプロセスで実行されることを確認するためだけにあります。
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
を使用して、1 または 0 以外の値を返すuntilケースを処理できます。#do something until it returns 0
#!/bin/bash
false
until [ $? -eq 0 ]
do
#do something until it returns 0
done