เมื่อคุณเขียนบรรทัดคำสั่งในการแยกวิเคราะห์รหัสของคุณคุณจะต้องระบุว่าตัวเลือกใดที่มีอาร์กิวเมนต์และตัวเลือกใดไม่มี ตัวอย่างเช่นในเชลล์สคริปต์ยอมรับ-h
ตัวเลือก (สำหรับความช่วยเหลือเป็นต้น) และ-a
ตัวเลือกที่ควรโต้แย้ง
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
a:h
บิตกล่าวว่า "ผมคาดหวังว่าจะแยกสองตัวเลือก-a
และ-h
และ-a
ควรใช้อาร์กิวเมนต์" (มันเป็น:
หลังจากa
ที่บอก parser ที่-a
ใช้เวลาอาร์กิวเมนต์)
ดังนั้นจึงไม่เคยมีความกำกวมใด ๆ ในกรณีที่ตัวเลือกสิ้นสุดลงซึ่งค่าของมันเริ่มต้นและที่อื่นจะเริ่มหลังจากนั้น
ใช้มัน
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
นี่คือเหตุผลที่คุณใช้เวลาส่วนใหญ่ไม่ควรเขียนตัวแยกวิเคราะห์บรรทัดคำสั่งของคุณเองเพื่อแยกวิเคราะห์ตัวเลือก
มีเพียงกรณีเดียวในตัวอย่างนี้ที่มีเล่ห์เหลี่ยม การแยกวิเคราะห์มักจะหยุดที่ไม่ใช่ตัวเลือกแรกดังนั้นเมื่อคุณมีข้อมูลในบรรทัดคำสั่งที่ดูเหมือนตัวเลือก:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
การแก้ปัญหาต่อไปนี้:
$ bash test.sh -a hello -- -world
h: 0
a: hello
--
สัญญาณสิ้นสุดของตัวเลือกบรรทัดคำสั่งและ-world
บิตที่เหลืออยู่สำหรับโปรแกรมที่จะทำสิ่งที่มันต้องการด้วย (มันในหนึ่งในตัวแปรตำแหน่ง)
rm
นั่นคือโดยวิธีการวิธีการที่คุณเอาแฟ้มที่มีเส้นประในการเริ่มต้นของชื่อไฟล์ที่มีให้
แก้ไข :
โปรแกรมอรรถประโยชน์ที่เขียนในการโทร C getopt()
(ประกาศในunistd.h
) ซึ่งทำงานในลักษณะเดียวกัน ในความเป็นจริงสำหรับทุกสิ่งที่เรารู้ว่าbash
ฟังก์ชั่นอาจจะดำเนินการโดยใช้การเรียกฟังก์ชันgetopts
C ห้องสมุด getopt()
Perl, Python และภาษาอื่น ๆ มีการแยกวิเคราะห์บรรทัดคำสั่งที่คล้ายกันและเป็นไปได้มากว่ามันจะทำการแยกวิเคราะห์ด้วยวิธีที่คล้ายกัน
บางส่วนของรูทีนไลบรารี่getopt
และgetopt
เหมือนเหล่านี้ยังจัดการกับตัวเลือก "ยาว" ตัวเลือกเหล่านี้มักจะนำหน้าด้วย double-dash ( --
) และตัวเลือกแบบยาวที่ใช้อาร์กิวเมนต์มักจะทำหลังจากมีเครื่องหมายเท่ากันตัวอย่างเช่น--block-size=SIZE
ตัวเลือกของ [การใช้งานบางอย่างของ] du
ยูทิลิตี้ (ซึ่งอนุญาตให้-B SIZE
ระบุสิ่งเดียวกัน)
คู่มือเหตุผลมักเขียนเพื่อแสดงช่องว่างระหว่างตัวเลือกสั้น ๆ และข้อโต้แย้งของพวกเขาอาจจะอ่านง่าย
แก้ไข : เครื่องมือเก่าจริงๆ เช่นdd
และtar
ยูทิลิตี้มีตัวเลือกโดยไม่ต้องมีเครื่องหมายขีดกลางอยู่ข้างหน้า นี่คือเหตุผลทางประวัติศาสตร์อย่างแท้จริงและเพื่อรักษาความเข้ากันได้กับซอฟต์แวร์ที่ต้องอาศัยการทำงานในลักษณะนั้น tar
ยูทิลิตี้ได้รับความสามารถในการใช้ตัวเลือกที่มีขีดกลางในครั้งล่าสุดเพิ่มเติม คู่มือ BSD สำหรับtar
เรียกใช้ตัวเลือกแบบเก่าสำหรับ "การรวมธง"