44

戻り値を一度設定して、while ループに入るようにします。

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

これを機能させるに$? = 1は、最初に設定する必要がありますが、うまくいきません。

4

11 に答える 11

143

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回実行されることを保証します。これがあなたの目標であると私は信じています。

完全を期すためにexitreturnそれぞれが 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 +mset +o monitorまたはを使用して、ジョブ制御を無効にしshopt -u -o monitorます。有効にするにlastpipeshopt -s laspipe. これらの両方を行うexitと、前の例の により、whileループそれを含むシェルの両方が終了し、最後の処理echoは実行されません。

于 2012-05-05T00:58:50.307 に答える
25

false常に終了コード 1 を返します。

#!/bin/bash
false
while [ $? -eq 1 ]
do
#do something until it returns 0    
done
于 2012-05-04T12:56:23.203 に答える
12
#!/bin/bash

RC=1

while [ $RC -eq 1 ]
do

  #do something until it returns 0    

  RC=$?
done
于 2012-05-04T11:44:25.297 に答える
6

一部の回答は、コードの書き直しに依存しています。場合によっては、制御できない外部コードである可能性があります。

この特定の質問については、 $? を設定するだけで十分ですが。を 1 に設定しますが、$? を設定する必要がある場合は、任意の値に - 唯一の役立つ答えは、Dennis Williamson のものです。

新しい子を生成しない (ただし簡潔ではありません) もう少し効率的な方法は次のとおりです。

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

注:エコー部分は、現在のプロセスで実行されることを確認するためだけにあります。

于 2015-05-06T17:15:16.133 に答える
5

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

もちろん、標準的なそのようなコマンドはfalse.

于 2012-05-04T11:46:49.217 に答える
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
于 2012-05-04T11:50:42.753 に答える
0

を使用して、1 または 0 以外の値を返すuntilケースを処理できます。#do something until it returns 0

#!/bin/bash

false
until [ $? -eq 0 ]
do
#do something until it returns 0    
done
于 2013-08-12T18:24:34.567 に答える