Menggunakan getopt
Mengapa getopt?
Untuk menguraikan argumen baris perintah yang diuraikan untuk menghindari kebingungan dan memperjelas opsi yang kami parsing sehingga pembaca perintah dapat memahami apa yang terjadi.
Apa itu getopt?
getopt
digunakan untuk memecah opsi (parse) di baris perintah untuk penguraian yang mudah dengan prosedur shell, dan untuk memeriksa opsi hukum. Ia menggunakan getopt(3)
rutinitas GNU untuk melakukan ini.
getopt
dapat memiliki jenis opsi berikut.
- Opsi tanpa nilai
- opsi pasangan kunci-nilai
Catatan: Dalam dokumen ini, saat menjelaskan sintaks:
- Apa pun di dalam [] adalah parameter opsional dalam sintaks / contoh.
- adalah pemegang tempat, yang berarti harus diganti dengan nilai aktual.
BAGAIMANA CARA MENGGUNAKAN getopt
?
Sintaks: Bentuk Pertama
getopt optstring parameters
Contoh:
# This is correct
getopt "hv:t::" "-v 123 -t123"
getopt "hv:t::" "-v123 -t123" # -v and 123 doesn't have whitespace
# -h takes no value.
getopt "hv:t::" "-h -v123"
# This is wrong. after -t can't have whitespace.
# Only optional params cannot have whitespace between key and value
getopt "hv:t::" "-v 123 -t 123"
# Multiple arguments that takes value.
getopt "h:v:t::g::" "-h abc -v 123 -t21"
# Multiple arguments without value
# All of these are correct
getopt "hvt" "-htv"
getopt "hvt" "-h -t -v"
getopt "hvt" "-tv -h"
Di sini h, v, t adalah opsi dan -h -v -t adalah bagaimana opsi harus diberikan dalam command-line.
- 'h' adalah opsi tanpa nilai.
- 'v:' menyiratkan bahwa opsi -v memiliki nilai dan merupakan opsi wajib. ':' berarti memiliki nilai.
- 't ::' menyiratkan bahwa opsi -t memiliki nilai tetapi opsional. '::' berarti opsional.
Dalam param opsional, nilai tidak dapat memiliki pemisahan spasi dengan opsi. Jadi, dalam contoh "-t123", -t adalah opsi 123 adalah nilai.
Sintaks: Bentuk Kedua
getopt [getopt_options] [--] [optstring] [parameters]
Di sini setelah getopt dibagi menjadi lima bagian
- Perintah itu sendiri yaitu getopt
- Opsi getopt_options, menjelaskan cara mem-parsing argumen. opsi panjang dasbor tunggal, opsi dasbor ganda.
- -, pisahkan getopt_options dari opsi yang ingin Anda parsing dan opsi pendek yang diizinkan
- Opsi singkat, diambil segera setelah - ditemukan. Sama seperti sintaks Formulir pertama.
- Parameter, ini adalah opsi yang telah Anda masukkan ke dalam program. Opsi yang Anda ingin parse dan menetapkan nilai aktualnya.
Contohnya
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Sintaks: Bentuk Ketiga
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Di sini setelah getopt dibagi menjadi lima bagian
- Perintah itu sendiri yaitu getopt
- Opsi getopt_options, menjelaskan cara mem-parsing argumen. opsi panjang dasbor tunggal, opsi dasbor ganda.
- Opsi singkat yaitu -o atau --opsi. Sama seperti sintaks Formulir pertama tetapi dengan opsi "-o" dan sebelum "-" (tanda hubung ganda).
- -, pisahkan getopt_options dari opsi yang ingin Anda parsing dan opsi pendek yang diizinkan
- Parameter, ini adalah opsi yang telah Anda masukkan ke dalam program. Opsi yang Anda ingin parse dan menetapkan nilai aktualnya.
Contohnya
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options mengubah cara params baris perintah diuraikan.
Berikut adalah beberapa getopt_options
Opsi: -l atau --pilihan panjang
Perintah getopt berarti harus memungkinkan opsi multi-karakter dikenali. Beberapa opsi dipisahkan dengan koma.
Misalnya, --name=Karthik
adalah opsi panjang yang dikirim dalam baris perintah. Dalam getopt, penggunaan opsi panjang seperti
getopt "name:,version" "--name=Karthik"
Karena nama: ditentukan, opsi harus mengandung nilai
Opsi: -a atau --alternatif
Berarti perintah getopt harus memungkinkan opsi panjang untuk memiliki satu tanda hubung '-' daripada tanda hubung ganda '-'.
Contoh, alih-alih --name=Karthik
Anda bisa menggunakan saja-name=Karthik
getopt "name:,version" "-name=Karthik"
Contoh skrip lengkap dengan kode:
#!/bin/bash
# filename: commandLine.sh
# author: @theBuzzyCoder
showHelp() {
# `cat << EOF` This means that cat should stop reading when EOF is detected
cat << EOF
Usage: ./installer -v <espo-version> [-hrV]
Install Pre-requisites for EspoCRM with docker in Development mode
-h, -help, --help Display help
-v, -espo-version, --espo-version Set and Download specific version of EspoCRM
-r, -rebuild, --rebuild Rebuild php vendor directory using composer and compiled css using grunt
-V, -verbose, --verbose Run script in verbose mode. Will print out each step of execution.
EOF
# EOF is found above and hence cat command stops reading. This is equivalent to echo but much neater when printing out.
}
export version=0
export verbose=0
export rebuilt=0
# $@ is all command line parameters passed to the script.
# -o is for short options like -v
# -l is for long options with double dash like --version
# the comma separates different long options
# -a is for long options with single dash like -version
options=$(getopt -l "help,version:,verbose,rebuild,dryrun" -o "hv:Vrd" -a -- "$@")
# set --:
# If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters
# are set to the arguments, even if some of them begin with a ‘-’.
eval set -- "$options"
while true
do
case $1 in
-h|--help)
showHelp
exit 0
;;
-v|--version)
shift
export version=$1
;;
-V|--verbose)
export verbose=1
set -xv # Set xtrace and verbose mode.
;;
-r|--rebuild)
export rebuild=1
;;
--)
shift
break;;
esac
shift
done
Menjalankan file skrip ini:
# With short options grouped together and long option
# With double dash '--version'
bash commandLine.sh --version=1.0 -rV
# With short options grouped together and long option
# With single dash '-version'
bash commandLine.sh -version=1.0 -rV
# OR with short option that takes value, value separated by whitespace
# by key
bash commandLine.sh -v 1.0 -rV
# OR with short option that takes value, value without whitespace
# separation from key.
bash commandLine.sh -v1.0 -rV
# OR Separating individual short options
bash commandLine.sh -v1.0 -r -V
-s
, membuat argumen posisi:./myscript 45 anystring
.