GNU/Linux >> Belajar Linux >  >> Linux

Bash Scripting – Parse Argumen Dalam Bash Scripts Menggunakan getopts

Melewati 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 fungsi getopts bash bawaan di Linux.

Pengantar

Setiap perintah yang kita jalankan di terminal memiliki 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/bendera 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 mengurai argumen yang diteruskan ke skrip di bash.

Salah satunya adalah 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 singkat seperti -h , -v , -b , dll. Anda tidak dapat memberikan argumen panjang seperti --help , --version . Jika Anda ingin mengurai opsi panjang, ada utilitas lain yang disebut getopt yang merupakan program eksternal dan bukan bawaan bash.

Ada tiga kemungkinan skenario yang dapat saya pikirkan saat bekerja dengan flag/argumen.

  • Skrip yang berjalan meskipun tidak ada argumen atau flag yang diteruskan.
  • Skrip yang menerima tanda tetapi tanpa argumen.
  • Skrip yang menerima tanda dan argumen terkait untuk tanda tersebut.

Anda akan mempelajari cara membuat skrip bash yang memenuhi skenario di atas di bagian mendatang.

Mendapatkan Bantuan

Anda dapat menjalankan perintah bantuan berikut untuk mengakses bagian bantuan getopts.

$ getopts -help

Konstruk Inti Getopts

Ada empat istilah penting yang harus Anda ketahui agar dapat bekerja dengan getopts.

getopts: getopts optstring name [arg …]
  1. OPTSTRING - Daftar karakter yang dikenali sebagai argumen. Contoh:-h , -v .
  2. OPTNAME - Argumen yang diuraikan dari [email protected] akan disimpan di OPTNAME variabel. Anda dapat menggunakan nama apa saja sebagai optname.
  3. OPTARG - Jika ada argumen tambahan yang diteruskan maka itu disimpan di OPTARG variabel.
  4. OPTIND - Indeks yang menunjuk ke argumen berikutnya untuk diproses.

Saat Anda meneruskan argumen ke skrip, argumen tersebut akan disimpan dalam variabel [dilindungi email] Getopts akan mendapatkan daftar argumen dari [dilindungi email] menggunakan OPTIND dan menguraikannya.

Anda harus menentukan daftar argumen yang dikenali di OPTSTRING . While loop digunakan untuk mengulangi daftar argumen yang diteruskan dan menggunakan OPTIND , getopts akan mendapatkan argumen dan menyimpannya di OPTNAME .

Pernyataan kasus digunakan untuk memeriksa apakah polanya cocok dengan OPTNAME dan jalankan 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 "help " di mana ada sintaks penggunaan untuk skrip saya.

Saya menggunakan tiga argumen dalam OPTSTRING; "-s , -T , -h ". Variabel bernama ARG adalah OPTNAME digunakan dalam kode di bawah ini. Argumen yang diurai akan disimpan di $ARG dan menggunakan pernyataan kasus itu akan mencoba menemukan apakah polanya cocok dengan argumen di ARG variabel.

Skrip berikut akan menerima tanda seperti -s , -h , -T dan Anda juga dapat menggabungkan bendera seperti -shT .

#!/bin/bash

function help(){
    echo "USAGE: args.sh -s, -T <arg>, -h"
}

while getopts ":sT:h" ARG; do
  case "$ARG" in 
    s) echo "Running -s flag" ;;
    T) echo "Running -T flag"
       echo "Argument passed is $OPTARG" ;;
    h) help ;;
    :​) echo "argument missing" ;;
    \?) echo "Something is wrong" ;;
  esac
done

shift "$((OPTIND-1))"

Fungsionalitas kode di atas akan dijelaskan secara rinci di bagian yang akan datang.

Tidak Ada Argumen yang Lulus

Perilaku default getopts adalah jika tidak ada argumen yang diteruskan, itu tidak akan memunculkan pesan kesalahan dan akan keluar dengan kode kembali nol .

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 ([email protected] ) adalah nol atau tidak. Jika tidak ada argumen yang diteruskan, skrip akan gagal.

Lihatlah 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, jika tidak help fungsi akan berjalan dan skrip akan keluar dengan kode kembali 1 .

[email protected]
if [[ ${#PASSED_ARGS} -ne 0 ]]
then
  while getopts ":sT:h" ARG; do
  case "$ARG" in 
    s) echo "Running -s flag" ;;
    T) echo "Running -T flag"
       echo "Argument passed is $OPTARG" ;;
    h) help ;;
    :​) echo "argument missing for $ARG" ;;
    \?) echo "Something is wrong" ;;
  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 "Arguments stored in \[email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }

Argumen Dengan Bendera Dan Argumen yang Didukungnya

Anda dapat meneruskan tanda seperti -h atau -s ke skrip atau bendera dan argumen terkait seperti -T untuk itu. Anda harus menambahkan titik dua (: ) setelah pengidentifikasi bendera (-T ) untuk membuat bendera menerima argumen.

Pada kode di bawah ini, Anda dapat melihat saya telah menambahkan titik dua (: ) setelah pengenal T . Artinya ketika saya melewati -T tandai ke skrip, saya harus memberikan argumen tambahan dengannya.

while getopts ":sT:h" ARG; do

Ketika sebuah argumen diteruskan ke bendera 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 passed is $OPTARG" ;;

Anda juga dapat menggabungkan dan menjalankan beberapa argumen sekaligus.

Menangani Kesalahan

Mungkin ada situasi di mana argumen dilewatkan dengan salah dan skrip harus menimbulkan beberapa kesalahan.

Secara default, getopts akan menampilkan pesan kesalahan saat flag yang diteruskan tidak ada di OPTSTRING atau jika Anda gagal memberikan 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 melewati -x sebagai argumen pertama yang tidak ada di OPTSTRING . Kedua, -T memerlukan argumen tambahan yang gagal saya berikan. Dalam kedua kasus itu membuat saya salah.

Sekarang, Anda dapat menekan pesan kesalahan default dan mencetak pesan kesalahan Anda sendiri. Perhatikan pola berikut dari pernyataan kasus.

  • Titik dua (:) -> Jika tidak ada argumen tambahan yang diteruskan OPTARG akan disetel ke titik dua dan Anda dapat menulis logika untuk mencetak pesan kesalahan.
  • \? -> Ketika argumen yang tidak ada di OPTSTRING diteruskan, OPTNAME akan disetel ke "? ".
:​) echo "argument missing" ;;
\?) echo "Something is wrong" ;;

Penggunaan Shift dan OPTIND

Jika Anda mengambil skrip yang ada yang ditulis menggunakan getopts, Anda akan melihat pernyataan ini setelah while lingkaran.

shift "$((OPTIND-1))"

Saat skrip dipicu, OPTIND disetel ke 1 . OPTIND menunjuk ke posisi argumen berikutnya yang akan diproses oleh getopts.

Pernyataan di atas akan menghapus semua opsi yang diurai oleh getopts dan $1 tidak akan disetel ke argumen non-opsional pertama yang diteruskan ke skrip.

Kesimpulan

Pada 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 konsep intinya, maka itu menjadi mudah.

Bacaan Serupa:

  • Cara Parsing File CSV Dalam Skrip Bash Di Linux

Panduan pembuatan skrip Bash:

  • Cara Membuat Kotak Dialog GUI Dalam Skrip Bash Dengan Zenity Di Linux Dan Unix
  • Skrip Bash – Pernyataan Kasus
  • Skrip Bash – Pernyataan Bersyarat
  • Skrip Bash – Manipulasi String
  • Bash Scripting – Perintah Printf Dijelaskan Dengan Contoh
  • Bash Scripting – Array Terindeks Dijelaskan Dengan Contoh
  • Bash Scripting – Array Asosiatif Dijelaskan Dengan Contoh
  • Skrip Bash – Untuk Pengulangan Dijelaskan Dengan Contoh
  • Bash Scripting – Sementara Dan Sampai Perulangan Dijelaskan Dengan Contoh
  • Pengalihan Bash Dijelaskan Dengan Contoh
  • Bash Scripting – Variabel Dijelaskan Dengan Contoh
  • Bash Scripting – Fungsi Dijelaskan Dengan Contoh
  • Perintah Bash Echo Dijelaskan Dengan Contoh Di Linux
  • Tutorial Bash Heredoc Untuk Pemula

Linux
  1. Skrip bash(I)

  2. Berikan Dua Argumen Untuk Satu Opsi Menggunakan Getopts?

  3. Menggunakan Perintah Nama Dasar Linux di Skrip Bash

  1. Menggunakan Bash untuk otomatisasi

  2. Penanganan kesalahan dalam skrip Bash

  3. mengotomatiskan sesi telnet menggunakan skrip bash

  1. Menambahkan argumen dan opsi ke skrip Bash Anda

  2. Menggunakan Perintah Tidur Linux di Skrip Bash

  3. Bagaimana cara mengurai header HTTP menggunakan Bash?