while
Bashループの「条件」セクションで繰り返し呼び出される関数の終了コードを取得しようとしています。
while <function>; do
<stuff>
done
エラーのためにこのループが終了したときに必要な終了コード<function>
。それを得る方法についてのアイデアはありますか?
ベストアンサー1
条件の終了値をキャプチャして前方に伝播できます。
while rmdir FOO; ss=$?; [[ $ss -eq 0 ]]
do
echo in loop
done
echo "out of loop with ?=$? but ss=$ss"
出力
rmdir: failed to remove 'FOO': No such file or directory
out of loop with ?=0 but ss=1
この場合、終了ステータスはrmdir FOO
変数にキャプチャされていss
ます1
。 (rmdir FOO
に置き換えてください( exit 4 )
。と表示されますss=4
。)
どのように動作しますか?構文は実際にはよりwhile list-1; do list-2; done
一般的な期待ではないことに注意してくださいwhile command; do list; done
。セミコロンで区切られた一連の命令であり、マニュアルにlist-1
はwhile
list-2
このコマンドは、リストの最後のコマンドが終了ステータス0を返す限り、リストを実行し続けますlist-1
。」
混乱しているように見えるwhile
条件を表現する別の方法として、式の内部に変数を割り当てた(( ... ))
後、その結果を使用できます。これは読みにくいですが、より簡潔な割り当てとテスト構造を提供します。
while rmdir FOO; ((! (ss=$?)))
do
echo in loop
done
echo "out of loop with ?=$? but ss=$ss"
またはを使用できますwhile rmdir FOO; ! (( ss=$? ))
。これは、((1)の算術評価が1であり、通常はtrueに関連付けられ、その評価の終了コードが0(成功)であるために機能します。一方、((0))の算術評価は0であり、これは通常falseに関連付けられているため、この計算の終了コードは1(失敗)です。両方の評価が「成功」した後に混乱しているように見えるかもしれませんが、bashの成功/失敗終了コードと一致するtrue / falseを表す算術式の値を作成し、などの条件式に基づいているかどうかに関係なく作成する((.))
ことはハッキングですです。終了コードや算術値はすべてうまく機能します。if ...; then ...; fi
while ...; do ...; done