Saya mencoba mencari cara melewatkan parameter dalam fungsi Bash, tetapi yang muncul selalu bagaimana cara melewatkan parameter dari baris perintah.
Saya ingin meneruskan parameter dalam skrip saya. Saya mencoba:
myBackupFunction("..", "...", "xx")
function myBackupFunction($directory, $options, $rootPassword) {
...
}
Tapi sintaksnya tidak benar, bagaimana cara melewatkan parameter ke fungsi saya?
bash
parameters
arguments
stivlo
sumber
sumber
Jawaban:
Ada dua cara khas untuk mendeklarasikan suatu fungsi. Saya lebih suka pendekatan kedua.
atau
Untuk memanggil fungsi dengan argumen:
Fungsi mengacu pada argumen yang diteruskan oleh posisi mereka (bukan dengan nama), yaitu $ 1, $ 2, dan sebagainya. $ 0 adalah nama skrip itu sendiri.
Contoh:
Juga, Anda perlu memanggil fungsi Anda setelah dideklarasikan.
Keluaran:
Referensi: Lanjutan Bash-Scripting Guide .
sumber
function name() {}
. Mungkin dengan 'masuk' sebelum{}
function
kata kunci dan yang()
. Tujuan saya (dalam file, bukan baris perintah) adalah untuk meningkatkan kejelasan, bukan mengurangi jumlah karakter yang diketik, yaitufunction myBackupFunction() compound-statement
,.function
versi kata kunci adalah ekstensi; formulir lain berfungsi di semua shell yang sesuai dengan POSIX.function
kata kunci memiliki jaminan di shell ksh-family lama yang memperkenalkannya bahwa bash modern tidak menghormati (dalam shell seperti itu,function
membuat variabel lokal-secara-default; dalam bash , itu tidak). Dengan demikian, penggunaannya mengurangi kejelasan bagi siapa saja yang tahu, dan mungkin mengharapkan, perilaku ksh. Lihat wiki.bash-hackers.org/scripting/obsoletePengetahuan tentang bahasa pemrograman tingkat tinggi (C / C ++ / Java / PHP / Python / Perl ...) akan menyarankan kepada orang awam bahwa fungsi bash harus bekerja seperti yang mereka lakukan dalam bahasa lain. Sebagai gantinya , fungsi bash bekerja seperti perintah shell dan mengharapkan argumen untuk diteruskan kepada mereka dengan cara yang sama orang mungkin memberikan opsi ke perintah shell (misalnya
ls -l
). Akibatnya, argumen fungsi di bash diperlakukan sebagai parameter posisi ($1, $2..$9, ${10}, ${11}
, dan seterusnya). Ini tidak mengherankan mengingat caragetopts
kerjanya. Jangan gunakan tanda kurung untuk memanggil fungsi dalam bash.( Catatan : Kebetulan saya sedang mengerjakan Open Solaris saat ini.)
Ingin menggunakan nama untuk variabel. Lakukan saja ini.
Ingin meneruskan array ke suatu fungsi?
Di dalam fungsinya, tangani argumen seperti ini.
Perlu meneruskan nilai dan array, tetapi masih menggunakan "$ @" di dalam fungsi?
sumber
Jika Anda lebih suka parameter bernama, dimungkinkan (dengan beberapa trik) untuk benar-benar meneruskan parameter bernama ke fungsi (juga memungkinkan untuk melewatkan array dan referensi).
Metode yang saya kembangkan memungkinkan Anda untuk menentukan parameter bernama yang diteruskan ke fungsi seperti ini:
Anda juga dapat membuat anotasi argumen sebagai @required atau @readonly, membuat ... sisanya argumen, membuat array dari argumen sekuensial (menggunakan misal
string[4]
) dan secara opsional daftar argumen dalam beberapa baris:Dengan kata lain, tidak hanya Anda dapat memanggil parameter Anda dengan namanya (yang merupakan inti yang lebih mudah dibaca), Anda sebenarnya dapat melewatkan array (dan referensi ke variabel - fitur ini hanya bekerja di bash 4.3)! Plus, variabel yang dipetakan semuanya berada dalam lingkup lokal, sama seperti $ 1 (dan lainnya).
Kode yang membuat pekerjaan ini cukup ringan dan berfungsi baik di bash 3 dan bash 4 (ini adalah satu-satunya versi yang telah saya uji dengan). Jika Anda tertarik dengan lebih banyak trik seperti ini yang membuat pengembangan dengan bash jauh lebih baik dan lebih mudah, Anda dapat melihat pada Bash Infinity Framework saya , kode di bawah ini tersedia sebagai salah satu fungsinya.
sumber
@var
,@reference
,@params
variabel? Apa yang harus saya cari di internet untuk mempelajari lebih lanjut tentang ini?ucommon
dan kode saya. Mungkin Anda memiliki beberapa alat yang diinstal yang menyebabkan masalah yang Anda sebutkan, tidak tahu apa itu.Kehilangan paren dan koma:
dan fungsinya akan terlihat seperti ini:
sumber
Saya harap contoh ini dapat membantu Anda. Dibutuhkan dua angka dari pengguna, mengumpankannya ke fungsi yang disebut
add
(pada baris terakhir dari kode), danadd
akan menjumlahkannya dan mencetaknya.sumber
Contoh sederhana yang akan dihapus saat menjalankan skrip atau skrip di dalam saat memanggil fungsi.
sumber
Pikir saya akan pipa dengan menyebutkan cara lain untuk melewati parameter bernama ke bash ... lewat referensi. Ini didukung pada bash 4.0
Sintaks alternatif untuk bash 4.3 menggunakan a nameref
Meskipun nameref jauh lebih nyaman karena dereferences mulus, beberapa distro yang didukung lebih tua masih mengirimkan versi yang lebih tua sehingga saya tidak akan merekomendasikannya.
sumber