ใช้ getopt
ทำไม getopt
ในการแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งที่ซับซ้อนเพื่อหลีกเลี่ยงความสับสนและชี้แจงตัวเลือกที่เราแยกวิเคราะห์เพื่อให้ผู้อ่านคำสั่งสามารถเข้าใจสิ่งที่เกิดขึ้น
getopt คืออะไร
getopt
ใช้เพื่อแยกตัวเลือก (แยกวิเคราะห์) ในบรรทัดคำสั่งเพื่อให้ง่ายในการแยกวิเคราะห์โดยเชลล์โพรซีเดอร์และเพื่อตรวจสอบตัวเลือกทางกฎหมาย มันใช้รูทีน GNU getopt(3)
เพื่อทำสิ่งนี้
getopt
สามารถมีตัวเลือกประเภทต่อไปนี้
- ตัวเลือกที่ไม่มีค่า
- ตัวเลือกคู่คีย์ - ค่า
หมายเหตุ: ในเอกสารนี้ระหว่างอธิบายไวยากรณ์:
- สิ่งใดภายใน [] เป็นพารามิเตอร์ทางเลือกในไวยากรณ์ / ตัวอย่าง
- เป็นตัวยึดตำแหน่งซึ่งหมายความว่าควรแทนที่ด้วยค่าจริง
จะใช้งานgetopt
อย่างไร?
ไวยากรณ์: แบบฟอร์มแรก
getopt optstring parameters
ตัวอย่าง:
# 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"
ที่นี่ h, v, t เป็นตัวเลือกและ -h -v -t เป็นวิธีที่ตัวเลือกควรได้รับในบรรทัดคำสั่ง
- 'h' เป็นตัวเลือกที่ไม่มีค่า
- 'v:' แสดงถึงตัวเลือกที่ -v มีค่าและเป็นตัวเลือกที่จำเป็น ':' หมายถึงมีค่า
- 't ::' หมายถึงตัวเลือกที่ -t มีค่า แต่เป็นตัวเลือก '::' หมายถึงตัวเลือก
ในพารามิเตอร์เสริมค่าไม่สามารถมีการแยกช่องว่างด้วยตัวเลือก ดังนั้นในตัวอย่าง "-t123" -t คือตัวเลือก 123 คือค่า
ไวยากรณ์: รูปแบบที่สอง
getopt [getopt_options] [--] [optstring] [parameters]
หลังจาก getopt ถูกแบ่งออกเป็นห้าส่วน
- คำสั่งตัวเองเช่น getopt
- getopt_options อธิบายวิธีแยกอาร์กิวเมนต์ ตัวเลือกเส้นประยาวเดี่ยวตัวเลือกเส้นประคู่
- - แยก getopt_options ออกจากตัวเลือกที่คุณต้องการแยกวิเคราะห์และตัวเลือกแบบย่อที่อนุญาต
- ตัวเลือกสั้น ๆ จะได้รับทันทีหลังจาก - พบ เหมือนกับไวยากรณ์รูปแบบแรก
- พารามิเตอร์เหล่านี้คือตัวเลือกที่คุณได้ส่งผ่านเข้าไปในโปรแกรม ตัวเลือกที่คุณต้องการแยกวิเคราะห์และรับค่าจริงที่ตั้งค่าไว้
ตัวอย่าง
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
ไวยากรณ์: รูปแบบที่สาม
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
หลังจาก getopt ถูกแบ่งออกเป็นห้าส่วน
- คำสั่งตัวเองเช่น getopt
- getopt_options อธิบายวิธีแยกอาร์กิวเมนต์ ตัวเลือกเส้นประยาวเดี่ยวตัวเลือกเส้นประคู่
- ตัวเลือกสั้น ๆ คือ -o หรือ --options เช่นเดียวกับไวยากรณ์รูปแบบแรก แต่มีตัวเลือก "-o" และก่อนหน้า "-" (เส้นประสองครั้ง)
- - แยก getopt_options ออกจากตัวเลือกที่คุณต้องการแยกวิเคราะห์และตัวเลือกแบบย่อที่อนุญาต
- พารามิเตอร์เหล่านี้คือตัวเลือกที่คุณได้ส่งผ่านเข้าไปในโปรแกรม ตัวเลือกที่คุณต้องการแยกวิเคราะห์และรับค่าจริงที่ตั้งค่าไว้
ตัวอย่าง
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options เปลี่ยนวิธีแยกพารามิเตอร์บรรทัดคำสั่ง
ด้านล่างนี้คือ getopt_options บางส่วน
ตัวเลือก: -l หรือ - longoptions
หมายถึงคำสั่ง getopt ควรอนุญาตให้รู้จักตัวเลือกหลายตัวได้ ตัวเลือกหลายตัวคั่นด้วยเครื่องหมายจุลภาค
ตัวอย่างเช่น--name=Karthik
เป็นตัวเลือกยาวที่ส่งในบรรทัดคำสั่ง ใน getopt การใช้งานตัวเลือกแบบยาวนั้นเป็นอย่างไร
getopt "name:,version" "--name=Karthik"
เนื่องจาก name: ถูกระบุตัวเลือกควรมีค่า
ตัวเลือก: - หรือ - ทางเลือก
หมายถึงคำสั่ง getopt ควรอนุญาตให้ตัวเลือกแบบยาวมีเครื่องหมายขีดกลาง '-' แทนที่จะเป็นเครื่องหมายขีดกลางคู่ '-'
ตัวอย่างแทนที่จะ--name=Karthik
ใช้เพียง-name=Karthik
getopt "name:,version" "-name=Karthik"
ตัวอย่างสคริปต์ที่สมบูรณ์พร้อมรหัส:
#!/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
เรียกใช้ไฟล์สคริปต์นี้:
# 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
ทำให้เป็นอาร์กิวเมนต์ตำแหน่ง:./myscript 45 anystring
.