Lebih
Nilai kembali di Bash fungsi
Saya bekerja dengan bash script dan saya ingin menjalankan fungsi untuk mencetak kembali nilai:
function fun1(){
return 34
}
function fun2(){
local res=$(fun1)
echo $res
}
Ketika saya mengeksekusi fun2
, itu tidak mencetak "34". Mengapa hal ini terjadi?
265
9
Meskipun bash telah
kembali
pernyataan, satu-satunya hal yang dapat anda tentukan dengan itu adalah fungsi's sendirikeluar
status (nilai antara0
dan255
, 0 yang berarti "sukses"). Jadikembali
ini bukan apa yang anda inginkan.Anda mungkin ingin mengubah anda
kembali
pernyataan untuk sebuahecho
pernyataan - dengan cara itu anda fungsi output bisa ditangkap dengan menggunakan$()
kawat gigi, yang tampaknya menjadi apa yang anda inginkan.Berikut ini sebuah contoh:
Cara lain untuk mendapatkan kembali nilai (jika anda hanya ingin mengembalikan integer 0-255) adalah
$?
.Juga, perhatikan bahwa anda dapat menggunakan kembali nilai untuk menggunakan logika boolean seperti
fun1 || fun2
hanya akan menjalankanfun2
jikafun1
kembali0
nilai. Default nilai kembali adalah nilai keluar dari pernyataan terakhir yang dieksekusi di dalam fungsi.$(...)
menangkap teks yang dikirim ke stdout oleh perintah yang terkandung di dalamnya.kembali
tidak output ke stdout.$?
berisi kode hasil dari perintah terakhir.Fungsi di Bash tidak fungsi seperti dalam bahasa lain; mereka're sebenarnya perintah. Jadi fungsi-fungsi yang digunakan seolah-olah mereka binari atau script yang diambil dari jalan anda. Dari perspektif dari logika program yang ada harus benar-benar tidak ada perbedaan.
Perintah Shell yang dihubungkan dengan pipa-pipa (alias aliran), dan tidak mendasar atau user-defined data types, seperti di "nyata" bahasa pemrograman. Tidak ada hal seperti itu seperti kembali nilai untuk perintah, mungkin sebagian besar karena ada's tidak ada cara nyata untuk menyatakan hal itu. Itu bisa terjadi pada pria-halaman, atau
--help
output dari perintah, tetapi keduanya hanya dapat dibaca manusia dan karenanya ditulis untuk angin.Ketika perintah yang ingin mendapatkan masukan-masukan itu membaca dari input stream, atau daftar argumen. Dalam kedua kasus string teks harus diurai.
Ketika perintah yang ingin kembali sesuatu yang telah
echo
ke output stream. Lain sering dipraktekkan cara adalah untuk menyimpan return value dalam berdedikasi, global variabel. Menulis ke output stream yang lebih jelas dan lebih fleksibel, karena dapat mengambil juga data biner. Misalnya, anda dapat kembali GUMPALAN dengan mudah:Seperti yang telah ditulis orang lain di thread ini, pemanggil dapat juga menggunakan perintah substitusi
$()
untuk menangkap output.Parallely, fungsi akan "kembalikan" kode keluar dari
gpg
(GnuPG). Pikirkan kode keluar sebagai bonus yang lain bahasa don't memiliki, atau, tergantung pada temperamen, sebagai "Schmutzeffekt" fungsi shell. Status ini, dengan konvensi, 0 pada keberhasilan atau integer dalam range 1-255 untuk sesuatu yang lain. Untuk membuat ini jelas:return
(sepertikeluar
) hanya dapat mengambil nilai dari 0-255, dan nilai-nilai lain dari 0 belum tentu kesalahan, seperti yang sering menegaskan.Ketika anda don't memberikan eksplisit nilai dengan
return
status ini diambil dari perintah terakhir yang di Bash pernyataan/fungsi/perintah dan sebagainya. Jadi selalu ada status, dankembali
adalah cara mudah untuk memberikan itu.Kembali
pernyataan set kode keluar dari fungsi, sama sepertikeluar
akan lakukan untuk seluruh naskah.Kode keluar untuk perintah terakhir selalu tersedia di
$?
variabel.Masalah dengan jawaban lainnya adalah mereka juga menggunakan global, yang dapat ditimpa ketika beberapa fungsi dalam panggilan rantai, atau
echo
yang berarti fungsi anda tidak dapat output info diagnostik (anda akan lupa anda fungsi ini dan "hasil", yaitu nilai kembali, akan mengandung lebih banyak info dari pemanggil anda mengharapkan, menyebabkan bug yang aneh), ataueval
yang terlalu berat dan hacky.Cara yang tepat untuk melakukan ini adalah untuk menempatkan tingkat atas barang-barang dalam fungsi dan menggunakan
lokal
dengan bash's dinamis scoping aturan. Contoh:Ini output
Dinamis pelingkupan berarti bahwa
ret_val
poin untuk objek yang berbeda tergantung pada pemanggil! Ini berbeda dari leksikal scoping, yang adalah apa yang kebanyakan bahasa pemrograman yang digunakan. Ini adalah benar-benar fitur didokumentasikan, hanya mudah untuk kehilangan, dan tidak menjelaskan dengan sangat baik, berikut ini merupakan dokumentasi untuk itu (penekanan saya):Untuk seseorang dengan C/C++/Python/Java/C#/javascript latar belakang, ini mungkin adalah rintangan terbesar: fungsi di bash tidak fungsi, mereka perintah-perintah, dan berperilaku seperti itu: mereka dapat output ke
stdout
/stderr
, mereka dapat pipe in/out, mereka dapat kembali kode keluar. Pada dasarnya tidak ada perbedaan antara mendefinisikan perintah dalam suatu script dan menciptakan sebuah executable yang dapat dipanggil dari command line.Jadi alih-alih menulis script seperti ini:
menulis itu seperti ini:
di mana
main()
menyatakanret_val
sebagailokal
dan semua fungsi lainnya kembali nilai-nilai melaluiret_val
.Lihat juga berikut Unix & Linux pertanyaan: Cakupan Variabel Lokal dalam Shell Functions.
Lain, bahkan mungkin solusi yang lebih baik tergantung pada situasi, adalah salah satu diposting oleh ya.teck yang menggunakan
lokal -n
.Cara lain untuk mencapai hal ini adalah referensi nama (membutuhkan Bash 4.3+).
Saya ingin melakukan hal berikut ini jika dijalankan dalam script yang mana fungsi ini didefinisikan:
Saya suka ini, karena saya kemudian dapat mencakup echo pernyataan dalam fungsi saya jika saya ingin
Sebagai add-on untuk orang lain' baik posting, di sini's sebuah artikel yang merangkum teknik-teknik ini:
Kembali nilai-Nilai dari Bash Fungsi
Git Bash di Windows menggunakan array untuk beberapa kembali nilai-nilai
BASH KODE: