Lebih mendalam ke dalam kerumitan fungsi dengan skrip shell - Bahagian VII
- 691
- 81
- Chris Little I
Artikel saya sebelumnya mengenai "Memahami dan Menulis Fungsi dalam Skrip Shell" mungkin memberi anda idea asas tentang cara menulis fungsi di bawah skrip shell. Kini sudah tiba masanya untuk mendapatkan ciri -ciri fungsional yang lebih mendalam seperti penggunaan pembolehubah dan rekursi tempatan.
Fungsi kerumitan dengan skrip shellPembolehubah tempatan
Apa yang menjadikan pemboleh ubah tempatan? Ia bergantung pada blok tertentu di mana pemboleh ubah diisytiharkan. Pemboleh ubah diisytiharkan sebagai tempatan boleh diakses dari blok kod di mana ia kelihatan i.e. skopnya adalah tempatan. Untuk menjelaskan perkara ini, mari kita lihat satu contoh di bawah.
#!/bin/bash func () local i = 10 j = 20 echo "i dari func = $ i" echo "j dari func = $ j" echo "i di luar func = $ i" echo "j di luar func = $ j "func echo" saya di luar func = $ i "echo" j luar func = $ j "Exit 0
Semasa melaksanakan skrip di atas output akan.
saya berada di luar func = j luar func = i dari func = 10 j dari func = 20 saya di luar func = j luar func = 20
Ini kerana fungsi Func belum dipanggil sementara pertama 2 Kenyataan echo dilaksanakan. Setelah memanggil fungsi Func sama 2 pernyataan echo menghasilkan hasil yang berbeza. Sekarang pemboleh ubah j, yang diisytiharkan di dalam Func dan bukan tempatan, boleh diakses selepas itu.
Oleh itu nilai untuk j menjadi 20. Bagaimana dengan pemboleh ubah tempatan i? Oleh kerana skopnya berada di dalam fungsi Func, nilai 10 tidak dapat diakses dari luar. Perhatikan bahawa pemboleh ubah j biasanya diisytiharkan di dalam Func adalah global secara lalai.
Sekarang anda sudah biasa dengan pembolehubah tempatan dan cara menggunakannya di dalam blok fungsi. Marilah kita beralih ke bahagian yang paling menarik di bawah fungsi, rekursi.
Apa itu rekursi?
Fungsi yang dipanggil sendiri biasanya disebut sebagai prosedur rekursi. Atau ia boleh ditakrifkan sebagai menyatakan algoritma dengan menggunakan versi yang lebih mudah dari algoritma yang sama. Pertimbangkan contoh mencari faktorial nombor. Kami tahu itu n! = 1 x 2 x 3 x ... x (n-1) x n. Oleh itu kita boleh menulis hubungan berulang sebagai:
n! = (n-1)! x n
Oleh itu, mudah bagi kami untuk memanggil semula fungsi yang sama dan menggunakan nilai pulangan dari setiap panggilan untuk membiak dengan hasil sebelumnya, i.e.
5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1
Rekursi menggunakan pembolehubah tempatan
Di sini kami cuba menulis skrip untuk mencari faktorial nombor menggunakan pembolehubah dan rekursi tempatan.
#!/bin/bash fakta () num local = $ 1 if [$ num -eq 0]; maka ret = 1 else temp = $ ((num-1)) fakta $ temp ret = $ ((num*$?)) fi pulangan $ ret fakta 5 echo "factorial of 5 = $?"Keluar 0
num adalah pemboleh ubah tempatan yang digunakan untuk menyimpan masing -masing n-1 nilai pada setiap panggilan. Di sini keadaan asas memeriksa sama ada nombor itu sama dengan sifar atau tidak (sejak 0! = 1 dan faktorial tidak ditakrifkan untuk nombor negatif). Apabila mencapai keadaan asas ini, ia mengembalikan nilai 1 kepada pemanggilnya. Sekarang num = 1 dan ret = 1 x 1.
Pada masa ini ia kembali 1 kepada pemanggilnya. Sekarang num = 2 dan ret = 2 x 1 dan sebagainya. Akhirnya bila Num = 5 Nilai pulangan akan 24 dan keputusan akhir adalah ret = 5 x 24. Hasil akhir 120 diserahkan kepada pernyataan pemanggil awal dan dipaparkan.
Terdapat satu masalah dalam skrip di atas. Seperti yang saya jelaskan dalam artikel sebelumnya, fungsi tidak dapat mengembalikan bilangan bulat besar. Oleh itu, kiri kepada pengguna untuk mencari penyelesaian untuk isu di atas.
Q. Bolehkah kita melakukan rekursi tanpa menggunakan pembolehubah tempatan? Jawapannya Ya.
Rekursi tanpa pembolehubah tempatan
Lihat contoh berikut untuk memaparkan Siri Fibonacci menggunakan rekursi. Hubungan pengulangan asas adalah:
FIB (0) = 0 FIB (1) = 1 Lain Fib (N) = FIB (N-1) + FIB (N-2) Siri Fibonacci Menggunakan Rekursi #!/bin/bash fib () a = $ 1 if [$ a -lt 2]; Kemudian echo $ a else ((--a)) b = $ (fib $ a) ((--a)) c = $ (fib $ a) echo $ ((b+c)) fi untuk i dalam $ (seq 0 15) lakukan = $ (fib $ i) echo $ out selesai keluar 0
Tiada pemboleh ubah tempatan yang digunakan dalam skrip di atas. Saya harap anda dapat memahami aliran skrip semasa pelaksanaan.
Di sini nilai 15 mewakili bilangan istilah dalam Siri Fibonacci untuk dipaparkan. Adakah anda melihat sesuatu yang istimewa mengenai pelaksanaan skrip di atas. Memerlukan sedikit masa, bukan? Rekursi dalam skrip lebih perlahan daripada rekursi dalam bahasa pengaturcaraan seperti C.
Dengan artikel ini, saya merancang untuk menyimpulkan bahagian fungsi dalam skrip shell. Tetap dikemas kini dengan Tecmint untuk mempunyai artikel yang akan datang mengenai tatasusunan dan banyak lagi…
- « Pelayan OpenVPN dan Pemasangan dan Konfigurasi Pelanggan di Debian 7
- Rainloop Webmail - Pelanggan e -mel berasaskan web moden untuk Linux »