Masalah dengan jawaban lain adalah mereka menggunakan global, yang dapat ditimpa ketika beberapa fungsi dalam rantai panggilan, atau echo
yang berarti fungsi Anda tidak dapat menampilkan informasi diagnostik (Anda akan lupa fungsi Anda melakukan ini dan "hasil", yaitu mengembalikan nilai, akan mengandung lebih banyak info dari yang diharapkan penelepon Anda, yang mengarah ke bug aneh), atau eval
yang terlalu berat dan peretasan.
Cara yang tepat untuk melakukan ini adalah dengan meletakkan hal-hal tingkat atas dalam suatu fungsi dan menggunakan local
aturan pelingkupan dinamis dengan bash. Contoh:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
Ini output
nothing
hi
bye
Pelingkupan dinamis berarti ret_val
menunjuk ke objek yang berbeda tergantung pada pemanggil! Ini berbeda dari pelingkupan leksikal, yang digunakan oleh sebagian besar bahasa pemrograman. Ini sebenarnya adalah fitur yang terdokumentasi , mudah dilewatkan, dan tidak dijelaskan dengan baik, berikut adalah dokumentasi untuk itu (penekanan ada pada saya):
Variabel lokal ke fungsi dapat dideklarasikan dengan builtin lokal. Variabel-variabel ini hanya dapat dilihat oleh fungsi dan perintah yang diminta .
Untuk seseorang dengan latar belakang javascript C / C ++ / Python / Java / C # /, ini mungkin merupakan rintangan terbesar: fungsi dalam bash bukan fungsi, mereka adalah perintah, dan berperilaku seperti itu: mereka dapat menampilkan ke stdout
/ stderr
, mereka dapat mengirim pipa ke / out, mereka dapat mengembalikan kode keluar. Pada dasarnya tidak ada perbedaan antara mendefinisikan perintah dalam skrip dan membuat executable yang dapat dipanggil dari baris perintah.
Jadi alih-alih menulis skrip Anda seperti ini:
top-level code
bunch of functions
more top-level code
tulis seperti ini:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
di mana main()
menyatakan ret_val
sebagai local
dan semua fungsi lainnya mengembalikan nilai melalui ret_val
.
Lihat juga pertanyaan Unix & Linux berikut: Cakupan Variabel Lokal di Fungsi Shell .
Solusi lain, mungkin lebih baik tergantung pada situasinya, adalah solusi yang diposting oleh ya.teck yang menggunakan local -n
.
return
dalam kasus Anda pada dasarnya sama denganexit code
yang berkisar dari0 - 255
. Gunakanecho
seperti yang disarankan oleh @septi. Kode keluar dapat ditangkap dengan$?
.