Cara Lulus Argumen ke Bash-Script

Perintah, sintaks dan contoh

Anda boleh menulis skrip bash supaya ia menerima hujah yang ditentukan ketika skrip dipanggil dari baris perintah. Kaedah ini digunakan apabila skrip perlu melaksanakan fungsi yang sedikit berbeza bergantung pada nilai parameter input (hujah-hujah).

Sebagai contoh, anda mungkin mempunyai skrip yang dipanggil "stats.sh" yang menjalankan operasi tertentu pada fail, seperti mengira kata-kata. Sekiranya anda ingin menggunakan skrip itu pada banyak fail, lebih baik lulus nama fail sebagai hujah, supaya anda dapat menggunakan skrip yang sama untuk semua proses yang akan diproses. Sebagai contoh, jika nama fail yang hendak diproses adalah "senarai lagu", anda akan memasukkan baris arahan berikut:

senarai lagu stats.sh

Argumen diakses dalam skrip menggunakan pembolehubah $ 1, $ 2, $ 3, dan sebagainya, di mana $ 1 merujuk kepada hujah pertama, $ 2 hingga hujah kedua, dan sebagainya. Ini digambarkan dalam contoh berikut:

FILE1 = $ 1 wc $ FILE1

Untuk kebolehbacaan, tetapkan pembolehubah dengan nama deskriptif kepada nilai hujah pertama ($ 1), dan kemudian panggil utiliti kiraan perkataan ( wc ) pada pembolehubah ini ($ FILE1).

Jika anda mempunyai bilangan argumen yang berubah-ubah, anda boleh menggunakan pembolehubah "$ @", yang merupakan pelbagai semua parameter input. Ini bermakna anda boleh menggunakan gelung untuk memprosesnya secara berulang-ulang, seperti digambarkan dalam contoh berikut:

untuk FILE1 dalam "$ @" lakukan wc $ FILE1 selesai

Berikut ialah contoh cara memanggil skrip ini dengan hujah-hujah dari baris arahan:

sh stats.sh songlist1 songlist2 songlist3

Jika argumen mempunyai ruang, anda perlu menyertakannya dengan sebut harga tunggal. Sebagai contoh:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

Sering skrip ditulis sedemikian rupa sehingga pengguna boleh lulus dalam hujah dalam sebarang pesanan menggunakan bendera. Dengan kaedah bendera, anda juga boleh membuat beberapa argumen pilihan.

Katakan anda mempunyai skrip yang mengambil maklumat daripada pangkalan data berdasarkan parameter yang ditentukan, seperti "nama pengguna", "tarikh" dan "produk", dan menghasilkan laporan dalam "format" yang ditentukan. Sekarang anda ingin menulis skrip anda supaya anda boleh lulus dalam parameter ini apabila skrip dipanggil. Mungkin kelihatan seperti ini:

pembuateport -u jsmith -p notebook -d 10-20-2011 -f pdf

Bash membolehkan fungsi ini dengan fungsi "getopts". Untuk contoh di atas, anda boleh menggunakan getopts seperti berikut:

Ini adalah gelung sementara yang menggunakan fungsi "getopts" dan "optstring" yang disebut, dalam kes ini "u: d: p: f:", untuk berulang melalui hujah-hujah. Gelung sementara berjalan melalui optik, yang mengandungi bendera yang boleh digunakan untuk lulus argumen, dan memberikan nilai argumen yang disediakan untuk bendera itu kepada "pilihan" pembolehubah. Pernyataan kes kemudiannya memberikan nilai "pilihan" pembolehubah kepada pemboleh ubah global yang boleh digunakan setelah semua hujah telah dibaca.

Kolon dalam optik bermaksud bahawa nilai diperlukan untuk bendera yang sepadan. Dalam contoh di atas semua bendera diikuti oleh usus besar: "u: d: p: f:". Maksudnya, semua bendera memerlukan nilai. Jika, sebagai contoh, bendera "d" dan "f" tidak dijangka mempunyai nilai, optik akan menjadi "u: dp: f".

Tanda titik pada permulaan optik, contohnya ": u: d: p: f:", mempunyai makna yang sama sekali berbeza. Ia membolehkan anda mengendalikan bendera yang tidak diwakili dalam opts. Dalam kes ini, nilai pembolehubah "pilihan" ditetapkan kepada "?" dan nilai "OPTARG" ditetapkan pada bendera yang tidak dijangka. Yang membolehkan anda memaparkan mesej ralat yang sesuai yang memaklumkan pengguna kesilapan itu.

Argumen yang tidak didahului oleh bendera diabaikan oleh getopts. Jika bendera yang dinyatakan dalam optstring tidak disediakan apabila skrip dipanggil, tiada apa yang berlaku, melainkan jika anda secara khusus mengendalikan kes ini dalam kod anda. Apa-apa hujah yang tidak ditangani oleh getter masih boleh ditangkap dengan pembolehubah biasa $ 1, $ 2, dan lain-lain.