15

$? を使用して以前に実行されたコマンドのステータスを確認する方法を知っており、exit コマンドを使用してそのステータスを確認できます。しかし、bash のループは常にステータス 0 を返すため、何らかのステータスでループを中断する方法はありますか。

#!/bin/bash
while true
do
        if [ -f "/test" ] ; then
                break ### Here I would like to exit with some status
        fi

done
echo $?  ## Here I want to check the status.
4

8 に答える 8

27

ループのステータスは、最後に実行されたコマンドのステータスです。ブレークを使用してループから抜け出すことができますが、ブレークが成功すると、ループのステータスはになります0。ただし、中断する代わりにサブシェルを使用して終了することができます。言い換えると:

for i in foo bar; do echo $i; false; break; done; echo $?  # The loop succeeds
( for i in foo bar; do echo $i; false; exit; done ); echo $? # The loop fails

ループを関数に入れて、そこから値を返すこともできます。例えば:

in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }
于 2012-12-27T18:37:34.057 に答える
3

このようなもの?

while true; do
    case $RANDOM in *0) exit 27 ;; esac
done

またはこのように?

rc=0
for file in *; do
    grep fnord "$file" || rc=$?
done
exit $rc

本当の問題は、1回の反復が失敗した場合に、ループの終了コードを成功させるか失敗させるかを決定することです。一方が他方よりも理にかなっているシナリオと、それがまったく明確ではないシナリオがあります。

于 2012-12-27T18:37:34.007 に答える
2

バッシュのマニュアルには次のように書かれています。

while list-1; do list-2; done
until list-1; do list-2; done
  [..]The exit status of the while and until commands is the exit status
  of the last command executed in list-2, or zero if none was executed.[..]

ループで実行される最後のコマンドはbreak. の終了値breakは 0 です (参照: help break)。

これが、プログラムが 0 で終了し続ける理由です。

于 2015-12-03T08:37:05.073 に答える