Meneruskan argumen ke program adalah salah satu operasi umum di semua bahasa yang Anda gunakan. Demikian pula, dalam artikel ini, kita akan melihat cara mengurai argumen dalam skrip bash menggunakan bash builtin getopts function.
Contents
IntroductionMendapatkan HelpCore Construct Of GetoptsNo Argument PassedArguments With Flags And Its Supported ArgumentsHandling ErrorsGunakan Shift dan OPTINDKesimpulanIntroduction
Setiap perintah yang kita jalankan di terminal argumen yang terkait dengannya. Misalnya, Anda dapat mengambil perintah paling dasar di Linux bernama df yang menampilkan penggunaan ruang disk sistem file. Ia menerima argumen/flag seperti -h, -i, --version, dll.
Mirip dengan ini ketika Anda membuat skrip shell tergantung pada kasus penggunaan, Anda mungkin harus memproses skrip berdasarkan argumen yang diteruskan.
Ada dua cara untuk parse argumen diteruskan ke skrip di bash.
One sedang menulis logika untuk mengurai argumen secara manual menggunakan variabel khusus [dilindungi email], $1, $2 … $N. Cara lain adalah dengan menggunakan getopts.
Getopts adalah fungsi bawaan bash yang kompatibel dengan POSIX yang menerima argumen pendek seperti -h, -v, -b, dll. Anda tidak dapat meneruskan argumen panjang seperti --help, --version. Jika Anda ingin mengurai opsi panjang, ada utilitas lain yang disebut getopt yang merupakan program eksternal dan bukan bash built-in.
Ada tiga kemungkinan skenario yang dapat saya pikirkan ketika bekerja dengan flags/arguments.
Script yang berjalan bahkan ketika tidak ada argumen atau flag dilewatkan.Script yang menerima flag tetapi tanpa argumen.Script yang menerima flag dan argumen terkait untuk flag.
Anda akan mempelajari cara membuat skrip bash yang memenuhi skenario di atas di bagian mendatang.
Mendapatkan Bantuan
Anda dapat menjalankan perintah berikut perintah bantuan untuk mengakses bagian bantuan getopts.
$ getopts -helpCore Konstruksi Getopts
Ada empat istilah penting yang harus Anda ketahui untuk bekerja dengan getopts.
getopts: getopts optstring name [arg …]OPTSTRING - Daftar karakter yang dikenali sebagai argumen. Contoh: -h, -v.OPTNAME - Argumen yang diuraikan dari [email protected] akan disimpan dalam variabel OPTNAME. Anda dapat menggunakan nama apa saja sebagai optname.OPTARG - Jika ada argumen tambahan yang diteruskan maka itu disimpan dalam variabel OPTARG.OPTIND - Indeks yang menunjuk ke argumen berikutnya untuk diproses.
Ketika Anda meneruskan argumen ke skrip, mereka akan disimpan di variabel [dilindungi email] Getopts akan mendapatkan daftar argumen dari [dilindungi email] menggunakan OPTIND dan menguraikannya.
Anda harus menentukan daftar argumen yang dikenali di OPTSTRING. Perulangan while digunakan untuk mengulangi daftar argumen yang diteruskan dan menggunakan getopt OPTIND akan mendapatkan argumen dan menyimpannya di OPTNAME.
Pernyataan case digunakan untuk memeriksa apakah pola cocok dengan OPTNAME dan menjalankan pernyataan yang sesuai.
Saya akan menjalankan kode di bawah ini di seluruh artikel. Ini adalah kode sederhana untuk dipahami. Pertama saya telah membuat fungsi bernama "bantuan" di mana ada sintaks penggunaan untuk skrip saya.
I menggunakan tiga argumen dalam OPTSTRING ; "-s, -T, -h". Variabel bernama ARG adalah OPTNAME yang digunakan dalam kode di bawah ini. Argumen yang diurai akan disimpan dalam $ARG dan menggunakan pernyataan kasus itu akan mencoba untuk menemukan apakah polanya cocok dengan argumen dalam variabel ARG.
Skrip berikut akan menerima tanda seperti -s, -h, -T dan Anda juga dapat menggabungkan tandai seperti -shT.
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T , -h" } while getopts ":sT:h" ARG; lakukan case "$ARG" di s) echo "Running -s flag" ;; T) echo "Menjalankan -T flag" echo "Argumen yang disahkan adalah $OPTARG" ;; h) bantuan ;; echo "argumen hilang" ;; ?) echo "Ada yang salah" ;; esac done shift "$((OPTIND-1))"
Fungsionalitas kode di atas akan dijelaskan secara rinci di bagian yang akan datang.
No Argument Passed
Perilaku default getopts adalah jika tidak ada argumen yang dilewatkan, itu tidak akan memunculkan pesan kesalahan dan akan keluar dengan kode kembali zero.
Dalam beberapa kasus, skrip tidak boleh dijalankan saat tidak ada argumen yang diteruskan. Dalam hal ini, Anda dapat menggunakan pernyataan bersyarat untuk memeriksa panjang argumen yang diteruskan ([dilindungi email]) adalah nol atau tidak. Jika tidak ada argumen yang dilewatkan, skrip akan gagal.
Lihat kode di bawah ini. Saya menyimpan argumen yang diteruskan ke variabel PASSED_ARGS dan memeriksa panjangnya. Jika panjang PASSED_ARGS bukan nol, maka while loop dengan getopts akan berjalan, selain itu fungsi bantuan akan berjalan dan skrip akan keluar dengan kode kembali 1.
[email protected] if [[ ${#PASSED_ARGS} -ne 0 ]] lalu while getopts ":sT:h" ARG; lakukan case "$ARG" di s) echo "Running -s flag" ;; T) echo "Menjalankan -T flag" echo "Argumen yang disahkan adalah $OPTARG" ;; h) bantuan ;; echo "argumen tidak ada untuk $ARG" ;; ?) echo "Ada yang salah" ;; esac done else help exit 1 fi shift "$((OPTIND-1))"
Anda juga dapat menggunakan satu baris berikut untuk mengevaluasi argumen yang diteruskan.
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Argumen disimpan di \[email protected] = [email protected]" || { echo "Tidak ada argumen yang lolos"; Tolong; keluar 1; }Arguments Dengan Flags Dan Argumen yang Didukung
Anda dapat meneruskan flag seperti -h atau -s ke skrip atau flag dan argumen terkait seperti -T ke skrip tersebut. Anda harus menambahkan titik dua (:) setelah pengidentifikasi bendera (-T) untuk membuat bendera menerima argumen.
Dalam kode di bawah ini, Anda dapat melihat saya telah menambahkan titik dua (:) setelah pengenal T. Artinya ketika saya meneruskan flag -T ke skrip, saya harus memberikan argumen tambahan dengan it.
while getopts ":sT:h" ARG; do
Ketika sebuah argumen diteruskan ke flag, argumen itu akan disimpan dalam variabel $OPTARG. Anda harus menulis logika untuk menangkap variabel dan memprosesnya sesuai dengan itu. Salin dan jalankan kode yang sama dari bagian sebelumnya.
T) echo "Running -T flag" echo "Argument yang diteruskan adalah $OPTARG" ;;
Anda juga dapat menggabungkan dan menjalankan beberapa argumen sekaligus.
Handling Errors
Mungkin ada situasi di mana argumen lulus salah dan skrip harus membuang beberapa kesalahan.
Secara default, getopts akan menampilkan pesan kesalahan saat flag yang diteruskan tidak ada di OPTSTRING atau jika Anda gagal meneruskan argumen tambahan ke flag. Menambahkan titik dua ke awal OPTSTRING akan menekan pesan kesalahan default.
Mari kita hapus titik dua dan jalankan skrip lagi. Saya melewatkan -x sebagai argumen pertama yang tidak ada di OPTSTRING. Kedua, -T memerlukan argumen tambahan yang gagal saya berikan. Dalam kedua kasus itu membuat saya error.
Sekarang, Anda dapat menekan pesan kesalahan default dan mencetak pesan kesalahan Anda sendiri. Lihat pola di bawah ini dari pernyataan kasus.
Colon (:) -> Jika tidak ada argumen tambahan yang dilewatkan, OPTARG akan disetel ke titik dua dan Anda dapat menulis logika untuk mencetak pesan kesalahan.? -> Ketika argumen yang tidak ada dalam OPTSTRING dilewatkan, OPTNAME akan disetel ke "?".
🙂 echo "argument missing" ;; ?) echo "Ada yang salah" ;;Penggunaan Shift dan OPTIND
Jika Anda mengambil skrip yang ada yang ditulis menggunakan getopts, Anda akan melihat pernyataan ini setelah while loop.
shift "$((OPTIND-1))"
Ketika skrip dipicu, OPTIND diatur ke 1. OPTIND menunjuk ke posisi argumen berikutnya untuk diproses oleh getopts.
Pernyataan di atas akan menghapus semua opsi yang diuraikan oleh getopts dan $1 tidak akan disetel ke argumen non-opsional pertama yang diteruskan ke skrip.
Conclusion
Dalam artikel ini, kita telah melihat cara mengurai argumen dalam skrip bash menggunakan fungsi getopts. Getopts hanya mendukung argumen bentuk pendek dan Anda tidak bisa memberikan argumen panjang.
Pada awalnya, mungkin tampak sulit untuk bekerja dengan getopts tetapi jika Anda memahami konstruk inti maka itu menjadi mudah.
Bash scripting guides:
Cara Membuat Kotak Dialog GUI Dalam Skrip Bash Dengan Zenity Di Linux Dan Skrip UnixBash – Pernyataan KasusBash Scripting – Bersyarat PernyataanBash Scripting – Manipulasi StringBash Scripting – Perintah Printf Dijelaskan Dengan ContohBash Scripting – Array Terindeks Dijelaskan Dengan ContohBash Scripting – Array Asosiatif Dijelaskan Dengan ContohBash Scripting – Untuk Loop Dijelaskan Dengan ContohBash Scripting – Sementara Dan Sampai Loop Dijelaskan Dengan ContohPengalihan Bash Dijelaskan Dengan ContohBash Scripting With ExampleBash Scripting – Fungsi Dijelaskan Dengan ExampleBash Perintah Echo Dijelaskan Dengan Contoh Di LinuxBash Heredoc Tutorial Untuk Pemula