Tidak ada goto
di bash.
Berikut adalah beberapa solusi kotor menggunakan trap
yang melompat hanya mundur :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
Keluaran:
$ ./test.sh
foo
I am
here now.
Ini tidak boleh digunakan dengan cara itu, tetapi hanya untuk tujuan pendidikan. Inilah mengapa ini bekerja:
trap
menggunakan penanganan pengecualian untuk mencapai perubahan dalam aliran kode. Dalam hal trap
ini menangkap apa pun yang menyebabkan skrip EXIT. Perintah goto
tidak ada, dan karenanya mengeluarkan kesalahan, yang biasanya akan keluar dari skrip. Kesalahan ini ditangkap trap
, dan2>/dev/null
menyembunyikan pesan kesalahan yang biasanya ditampilkan.
Implementasi goto ini jelas tidak dapat diandalkan, karena perintah yang tidak ada (atau kesalahan lainnya, dengan cara itu), akan menjalankan perintah perangkap yang sama. Khususnya, Anda tidak dapat memilih label mana yang akan dikunjungi.
Pada dasarnya dalam skenario nyata Anda tidak memerlukan pernyataan goto, itu berlebihan karena panggilan acak ke tempat yang berbeda hanya membuat kode Anda sulit dimengerti.
Jika kode Anda dipanggil berkali-kali, maka pertimbangkan untuk menggunakan loop dan mengubah alur kerjanya untuk menggunakan continue
dan break
.
Jika kode Anda berulang, pertimbangkan untuk menulis fungsi dan memanggilnya sebanyak yang Anda inginkan.
Jika kode Anda perlu melompat ke bagian tertentu berdasarkan nilai variabel, maka pertimbangkan untuk menggunakan case
pernyataan.
Jika Anda dapat memisahkan kode panjang Anda menjadi potongan-potongan kecil, pertimbangkan untuk memindahkannya ke file terpisah dan memanggilnya dari skrip induk.
goto
di bash (setidaknya katanyacommand not found
untuk saya). Mengapa? Kemungkinan ada cara yang lebih baik untuk melakukannya.