Jawaban:
Salah satu pendekatan adalah menambahkan set -e
ke awal skrip Anda. Itu berarti (dari help set
):
-e Exit immediately if a command exits with a non-zero status.
Jadi jika salah satu perintah Anda gagal, skrip akan keluar.
Atau, Anda dapat menambahkan exit
pernyataan eksplisit di titik kegagalan yang memungkinkan:
command || exit 1
set -e
satu-satunya cara saya tahu untuk melakukan itu.
set -e
adalah sleep
( break
menjadi builtin khusus akan menyebabkan skrip keluar pada kegagalan di sebagian besar shell, perintah di if
atau di sebelah kiri &&
tidak terpengaruh oleh set -e
, n=...
bisa gagal jika n
hanya baca, tapi kemudian yang akan keluar dari skrip tanpa set -e
juga), sehingga interpretasi terdengar sangat tidak mungkin. Saya setuju pertanyaan itu tidak ditulis dengan baik.
Anda dapat keluar dari skrip di mana saja menggunakan kata kunci exit
. Anda juga dapat menentukan kode keluar untuk menunjukkan kepada program lain bahwa atau bagaimana skrip Anda gagal, misalnya exit 1
atau exit 2
lain - lain (dengan konvensi, kode keluar 0 untuk kesuksesan dan apa pun yang lebih besar dari 0 menandakan kegagalan; namun, juga dengan konvensi, keluar kode di atas 127 dicadangkan untuk pemutusan yang tidak normal (misalnya dengan sinyal)).
Konstruksi generik untuk keluar dari kegagalan adalah
if [ failure condition ]; then
exit n
fi
dengan cocok failure condition
dan n
. Tetapi dalam skenario tertentu Anda dapat melanjutkan berbeda. Sekarang untuk kasus Anda, saya menafsirkan pertanyaan Anda bahwa jika salah satu dari lima doa gksu
gagal, maka Anda bermaksud untuk keluar. Salah satu caranya adalah dengan menggunakan fungsi seperti ini
function try_command {
for i in 1 2 3 4 5 ; do
if gksu command ; then
return 0
fi
fi
exit 1
}
dan kemudian, aktifkan loop oleh try_command
.
Ada (lebih) cara canggih atau canggih untuk menjawab pertanyaan Anda. Namun, solusi di atas lebih mudah diakses oleh pemula daripada, katakanlah, solusi Stephane.
attempt=0
until gksu command; do
attempt=$((attempt + 1))
if [ "$attempt" -gt 5 ]; then
exit 1
fi
done
exit
keluar dari skrip kecuali jika dipanggil dalam subkulit. Jika bagian skrip tersebut berada dalam subkulit, misalnya karena berada di dalam (...)
atau $(...)
atau bagian dari pipa-saluran, maka itu hanya akan keluar dari subkulit itu .
Dalam hal itu, jika Anda ingin skrip keluar selain subkulit, maka Anda harus memanggil exit
keluar subkulit tersebut.
Misalnya, di sini dengan 2 tingkat subshell bersarang:
(
life=hard
output=$(
echo blah
[ "$life" = easy ] || exit 1 # exit subshell
echo blih not run
) || exit # if the subshell exits with a non-zero exit status,
# exit as well with the same exit status
echo not run either
) || exit # if the subshell exits with a non-zero exit status,
# exit as well with the same exit status
Ini bisa menjadi lebih sulit jika subshell adalah bagian dari pipa. bash
memiliki khusus $PIPESTATUS
array, mirip dengan zsh
's $pipestatus
salah satu yang dapat membantu Anda di sini:
{
echo foo
exit 1
echo bar
} | wc -c
subshell_ret=${PIPESTATUS[0]}
if [ "$subshell_ret" -ne 0 ]; then
exit "$subshell_ret"
fi
Trap akan melakukan tindakan setelah menerima sinyal.
trap "echo EXIT; exit" 0
trap "echo HUP; exit" 1
trap "echo CTL-C; exit" 2
trap "echo QUIT; exit" 3
trap "echo ERR; exit" ERR
n=0
until [ $n -ge 5 ]
do
n=$[$n+1]
echo $n
sleep 3
done
Jalankan ini dan biarkan keluar secara normal. Itu terperangkap pada sinyal 0.
EXIT
Jalankan lagi dan interupsi dengan ^ C. Ia terperangkap pada sinyal 2 dan sinyal 0.
CTL-C
EXIT
Status keluar yang tidak nol akan menjebak ERR
ERR
EXIT
set -e
. Itu tidak benar-benar berlaku di sini. OP ingin keluar dari skrip setelah 5 upaya gagal menjalankan perintah.