ฉันไม่ได้เป็นผู้ชาย Linux แต่ติดอยู่ในสคริปต์บางอย่างที่ฉันต้องอ่านสำหรับโครงการของฉัน ดังนั้นทุกคนสามารถช่วยฉันในสิ่งที่คำสั่งนี้กำลังทำอะไรอยู่?
shift $(($optind - 1))
ฉันไม่ได้เป็นผู้ชาย Linux แต่ติดอยู่ในสคริปต์บางอย่างที่ฉันต้องอ่านสำหรับโครงการของฉัน ดังนั้นทุกคนสามารถช่วยฉันในสิ่งที่คำสั่งนี้กำลังทำอะไรอยู่?
shift $(($optind - 1))
คำตอบ:
shift $((OPTIND-1))
(หมายเหตุOPTIND
เป็นตัวพิมพ์ใหญ่) โดยปกติจะพบได้ทันทีหลังจากgetopts
while
วนรอบ$OPTIND
getopts
เป็นจำนวนตัวเลือกที่พบโดย
ในฐานะที่เป็น pauljohn32 กล่าวถึงในความคิดเห็นพูดอย่างเคร่งครัด OPTIND
ให้ตำแหน่งของอาร์กิวเมนต์บรรทัดคำสั่งต่อไป
จากคู่มืออ้างอิง GNU Bash :
getopts ชื่อ optstring [args]
getopts
ถูกใช้โดยเชลล์สคริปต์เพื่อวิเคราะห์พารามิเตอร์ตำแหน่งoptstring
มีอักขระตัวเลือกที่จะรับรู้; หากตัวละครตามด้วยโคลอนตัวเลือกที่คาดว่าจะมีการโต้แย้งซึ่งควรจะแยกออกจากมันด้วยช่องว่าง ห้ามใช้เครื่องหมายโคลอน (':') และเครื่องหมายคำถาม ('?') เป็นอักขระตัวเลือก ทุกครั้งที่มีการเรียกใช้ให้วางตัวgetopts
เลือกถัดไปในชื่อตัวแปรเชลล์เริ่มต้นname
หากไม่มีอยู่และดัชนีของอาร์กิวเมนต์ถัดไปจะถูกประมวลผลในตัวแปร โดยอัตโนมัติ จะต้องรีเซ็ตด้วยตนเองระหว่างการเรียกหลายครั้งไปยัง ภายในการเรียกใช้เชลล์เดียวกันหากจะใช้ชุดพารามิเตอร์ใหม่OPTIND
ถ้ามันไม่ได้อยู่และดัชนีของการโต้แย้งต่อไปที่จะนำมาแปรรูปเป็นตัวแปรOPTIND
ถูกเตรียมใช้งานเป็น 1 ทุกครั้งที่เชลล์หรือเชลล์สคริปต์ถูกเรียกใช้ เมื่อตัวเลือกต้องมีการโต้แย้ง, สถานที่ getoptsOPTARG
ว่าอาร์กิวเมนต์ลงในตัวแปร เชลล์ไม่ได้รีเซ็ตOPTIND
getopts
เมื่อพบตัวเลือกสุดท้ายให้
getopts
ออกโดยมีค่าส่งคืนมากกว่าศูนย์OPTIND
ถูกตั้งค่าเป็นดัชนีของอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกแรกและชื่อถูกตั้งค่าเป็น '?'
getopts
ปกติจะแยกวิเคราะห์พารามิเตอร์ตำแหน่ง แต่ถ้าข้อโต้แย้งมากขึ้นจะได้รับในargs
,getopts
แยกวิเคราะห์เหล่านั้นแทน
shift
n
ลบnสตริงจากตำแหน่งรายการพารามิเตอร์ ดังนั้นshift $((OPTIND-1))
จะลบตัวเลือกทั้งหมดที่ได้รับการแยกวิเคราะห์getopts
จากรายการพารามิเตอร์และหลังจากนั้นจุด$1
จะอ้างอิงถึงอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกแรกที่ส่งผ่านไปยังสคริปต์
ปรับปรุง
ในฐานะที่เป็น mikeserv กล่าวถึงในความคิดเห็นที่shift $((OPTIND-1))
อาจไม่ปลอดภัย เพื่อป้องกันการแยกคำอื่น ๆ ที่ไม่พึงประสงค์การขยายพารามิเตอร์ทั้งหมดควรถูกอ้างอิงสองครั้ง ดังนั้นรูปแบบที่ปลอดภัยสำหรับคำสั่งคือ
shift "$((OPTIND-1))"
find
) อาจดูเหมือนว่าพวกเขาอนุญาตตัวเลือกหลังจากที่ไม่ใช่ตัวเลือก แต่พวกเขาไม่: พวกเขามีตัวถูกดำเนินการที่ขึ้นต้นด้วยเส้นประ
IFS
แต่ก็ดีกว่าที่จะปลอดภัยกว่าขออภัย ;)
IFS=0123456789
, shift $((OPTIND-1))
(โดยไม่ต้องใส่เครื่องหมายอัญประกาศ) จะกลายเป็นshift ""
สิ่งที่จะถูกเพิกเฉย (ในksh
) หรือสร้างข้อผิดพลาด (ในbash
และdash
)
$((...))
เพียงแค่คำนวณสิ่งของ ในกรณีของคุณใช้ค่าของ$optint
และ substracts 1
shift
ลบพารามิเตอร์ตำแหน่ง ในกรณีของคุณจะลบoptint-1
พารามิเตอร์
สำหรับข้อมูลเพิ่มเติมดูได้ที่help getopts
, help shift
, ดูที่man bash
สำหรับ "การขยายตัวทางคณิตศาสตร์" getopts
และโดยเฉพาะอย่างยิ่งสำหรับ