戻り値を一度設定して、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