Sesuatu seperti ini?
while true; do
case $RANDOM in *0) exit 27 ;; esac
done
Atau seperti ini?
rc=0
for file in *; do
grep fnord "$file" || rc=$?
done
exit $rc
Pertanyaan sebenarnya adalah memutuskan apakah kode keluar dari loop harus berhasil atau gagal jika satu iterasi gagal. Ada skenario di mana yang satu lebih masuk akal daripada yang lain, dan yang lain sama sekali tidak jelas.
Status loop adalah status dari perintah terakhir yang dieksekusi. Anda dapat menggunakan break untuk keluar dari loop, tetapi jika break berhasil, maka status loop akan menjadi 0
. Namun, Anda dapat menggunakan subkulit dan keluar alih-alih melanggar. Dengan kata lain:
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
Anda juga bisa memasukkan loop ke dalam suatu fungsi dan mengembalikan nilai darinya. misalnya:
in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }
Manual bash mengatakan:
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.[..]
Perintah terakhir yang dijalankan di dalam loopnya adalah break
. Dan nilai keluar dari break
adalah 0 (lihat:help break
).
Inilah mengapa program Anda terus keluar dengan 0.