Sử dụng getopt
Tại sao lại nhận được?
Để phân tích các đối số dòng lệnh được xây dựng để tránh nhầm lẫn và làm rõ các tùy chọn chúng tôi đang phân tích cú pháp để người đọc các lệnh có thể hiểu những gì đang xảy ra.
Getopt là gì?
getopt
được sử dụng để chia nhỏ các tùy chọn (phân tích cú pháp) trong các dòng lệnh để dễ dàng phân tích cú pháp bằng các thủ tục shell và để kiểm tra các tùy chọn pháp lý. Nó sử dụng các getopt(3)
thường trình GNU để làm điều này.
getopt
có thể có các loại tùy chọn sau.
- Tùy chọn không có giá trị
- tùy chọn cặp khóa-giá trị
Lưu ý: Trong tài liệu này, trong khi giải thích cú pháp:
- Bất cứ điều gì bên trong [] là tham số tùy chọn trong cú pháp / ví dụ.
- là một người giữ chỗ, có nghĩa là nó nên được thay thế bằng một giá trị thực tế.
CÁCH SỬ DỤNG getopt
?
Cú pháp: Mẫu đầu tiên
getopt optstring parameters
Ví dụ:
# 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"
Ở đây h, v, t là các tùy chọn và -h -v -t là cách các tùy chọn nên được đưa ra trong dòng lệnh.
- 'h' là một tùy chọn không có giá trị.
- 'v:' ngụ ý rằng tùy chọn -v có giá trị và là tùy chọn bắt buộc. ':' có nghĩa là có một giá trị.
- 't ::' ngụ ý rằng tùy chọn -t có giá trị nhưng là tùy chọn. '::' có nghĩa là tùy chọn.
Trong tùy chọn param, giá trị không thể có sự phân tách khoảng trắng với tùy chọn. Vì vậy, trong ví dụ "-t123", -t là tùy chọn 123 là giá trị.
Cú pháp: Hình thức thứ hai
getopt [getopt_options] [--] [optstring] [parameters]
Ở đây sau khi getopt được chia thành năm phần
- Bản thân lệnh tức là getopt
- Getopt_options, nó mô tả cách phân tích các đối số. tùy chọn dấu gạch ngang dài, tùy chọn dấu gạch ngang kép.
- -, tách các getopt_options khỏi các tùy chọn bạn muốn phân tích và các tùy chọn ngắn được phép
- Các tùy chọn ngắn, được thực hiện ngay sau đó - được tìm thấy. Giống như cú pháp đầu tiên của Form.
- Các tham số, đây là các tùy chọn mà bạn đã truyền vào chương trình. Các tùy chọn bạn muốn phân tích cú pháp và lấy các giá trị thực tế được đặt trên chúng.
Ví dụ
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Cú pháp: Mẫu thứ ba
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Ở đây sau khi getopt được chia thành năm phần
- Bản thân lệnh tức là getopt
- Getopt_options, nó mô tả cách phân tích các đối số. tùy chọn dấu gạch ngang dài, tùy chọn dấu gạch ngang kép.
- Các tùy chọn ngắn tức là -o hoặc --options. Giống như cú pháp đầu tiên của Mẫu nhưng với tùy chọn "-o" và trước dấu "-" (dấu gạch ngang kép).
- -, tách các getopt_options khỏi các tùy chọn bạn muốn phân tích và các tùy chọn ngắn được phép
- Các tham số, đây là các tùy chọn mà bạn đã truyền vào chương trình. Các tùy chọn bạn muốn phân tích cú pháp và lấy các giá trị thực tế được đặt trên chúng.
Ví dụ
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options thay đổi cách các tham số dòng lệnh được phân tích cú pháp.
Dưới đây là một số getopt_options
Tùy chọn: -l hoặc --longoptions
Có nghĩa là lệnh getopt sẽ cho phép các tùy chọn đa ký tự được nhận dạng. Nhiều tùy chọn được phân tách bằng dấu phẩy.
Ví dụ, --name=Karthik
là một tùy chọn dài được gửi trong dòng lệnh. Trong getopt, việc sử dụng các tùy chọn dài giống như
getopt "name:,version" "--name=Karthik"
Vì tên: được chỉ định, tùy chọn sẽ chứa giá trị
Tùy chọn: -a hoặc --alternative
Có nghĩa là lệnh getopt sẽ cho phép tùy chọn dài có một dấu gạch ngang '-' thay vì dấu gạch ngang kép '-'.
Ví dụ, thay vì --name=Karthik
bạn chỉ có thể sử dụng-name=Karthik
getopt "name:,version" "-name=Karthik"
Một ví dụ hoàn chỉnh về kịch bản với mã:
#!/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
Chạy tệp script này:
# 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
, hãy đặt nó làm đối số vị trí :./myscript 45 anystring
.