Bash "while"ループが終了すると、条件付き関数の終了コードが必要です。

Bash

whileBashループの「条件」セクションで繰り返し呼び出される関数の終了コードを取得しようとしています。

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-1whilelist-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 ...; fiwhile ...; do ...; done

おすすめ記事