Saya memiliki skrip shell dengan loop bersarang dan baru tahu bahwa "keluar" tidak benar-benar keluar dari skrip, tetapi hanya loop saat ini. Apakah ada cara lain untuk sepenuhnya keluar dari skrip pada kondisi kesalahan tertentu?
Saya tidak ingin menggunakan "set -e", karena ada kesalahan yang dapat diterima dan itu akan membutuhkan penulisan ulang terlalu banyak.
Saat ini, saya menggunakan kill untuk mematikan proses secara manual, tetapi sepertinya harus ada cara yang lebih baik untuk melakukan ini.
bash -c 'for x in y z; do exit; done; echo "This never gets printed"'
.Jawaban:
Masalah Anda bukan loop bersarang, per se. Itu satu atau lebih dari loop batin Anda berjalan dalam subkulit .
Ini bekerja:
keluaran:
Ini menyajikan masalah yang telah Anda jelaskan:
keluaran:
Inilah solusinya; Anda harus menguji nilai balik loop internal yang berjalan dalam subkulit:
Perhatikan tesnya:
[[ $? != 0 ]] && exit $?
keluaran:
Sunting: Untuk memverifikasi Anda berada di subkulit apa, modifikasi skrip "jawab" untuk memberi tahu Anda apa proses ID dari shell Anda saat ini. CATATAN: Ini hanya berfungsi di bash 4:
keluaran:
Variabel "i" dan "j" dibawa kepada Anda dari Fortran. Semoga harimu menyenangkan. :-)
sumber
bash --version
pada baris perintah.Jawaban sebelumnya menyarankan menggunakan
[[ $? != 0 ]] && exit $?
namun hal ini tidak akan cukup bekerja seperti yang diharapkan, karena[[ $? != 0 ]]
tes akan mengatur ulang$?
kembali ke nol, yang berarti bahwa meskipun script akan awal-keluar seperti yang diharapkan, itu akan selalu keluar dengan kode 0 (tidak diharapkan) . Selain itu, akan lebih baik menggunakan-ne
uji perbandingan numerik, daripada!=
tes perbandingan string. Jadi karena itu IMHO solusi yang lebih baik adalah dengan menggunakan:karena itu akan memastikan bahwa kode keluar yang sebenarnya diatur dengan benar.
sumber
Anda bisa menggunakannya
break
.Dari
help break
:Jadi untuk keluar dari tiga loop tertutup yaitu jika Anda memiliki dua loop bersarang di dalam loop utama, gunakan ini untuk keluar dari semuanya:
sumber
for((i=0;i<3;i++));do echo A;for((j=0;j<2;j++));do echo B;break 2;done;done
exit
tidak mengakhiri seluruh shell, atau sub-shell saat ini:sumber