ฉันไม่ได้เป็นผู้ชาย Linux แต่ติดอยู่ในสคริปต์บางอย่างที่ฉันต้องอ่านสำหรับโครงการของฉัน ดังนั้นทุกคนสามารถช่วยฉันในสิ่งที่คำสั่งนี้กำลังทำอะไรอยู่?
shift $(($optind - 1))
ฉันไม่ได้เป็นผู้ชาย Linux แต่ติดอยู่ในสคริปต์บางอย่างที่ฉันต้องอ่านสำหรับโครงการของฉัน ดังนั้นทุกคนสามารถช่วยฉันในสิ่งที่คำสั่งนี้กำลังทำอะไรอยู่?
shift $(($optind - 1))
คำตอบ:
shift $((OPTIND-1))(หมายเหตุOPTINDเป็นตัวพิมพ์ใหญ่) โดยปกติจะพบได้ทันทีหลังจากgetopts whileวนรอบ$OPTINDgetoptsเป็นจำนวนตัวเลือกที่พบโดย
ในฐานะที่เป็น pauljohn32 กล่าวถึงในความคิดเห็นพูดอย่างเคร่งครัด OPTINDให้ตำแหน่งของอาร์กิวเมนต์บรรทัดคำสั่งต่อไป
จากคู่มืออ้างอิง GNU Bash :
getopts ชื่อ optstring [args]
getoptsถูกใช้โดยเชลล์สคริปต์เพื่อวิเคราะห์พารามิเตอร์ตำแหน่งoptstringมีอักขระตัวเลือกที่จะรับรู้; หากตัวละครตามด้วยโคลอนตัวเลือกที่คาดว่าจะมีการโต้แย้งซึ่งควรจะแยกออกจากมันด้วยช่องว่าง ห้ามใช้เครื่องหมายโคลอน (':') และเครื่องหมายคำถาม ('?') เป็นอักขระตัวเลือก ทุกครั้งที่มีการเรียกใช้ให้วางตัวgetoptsเลือกถัดไปในชื่อตัวแปรเชลล์เริ่มต้นnameหากไม่มีอยู่และดัชนีของอาร์กิวเมนต์ถัดไปจะถูกประมวลผลในตัวแปร โดยอัตโนมัติ จะต้องรีเซ็ตด้วยตนเองระหว่างการเรียกหลายครั้งไปยัง ภายในการเรียกใช้เชลล์เดียวกันหากจะใช้ชุดพารามิเตอร์ใหม่OPTINDถ้ามันไม่ได้อยู่และดัชนีของการโต้แย้งต่อไปที่จะนำมาแปรรูปเป็นตัวแปรOPTINDถูกเตรียมใช้งานเป็น 1 ทุกครั้งที่เชลล์หรือเชลล์สคริปต์ถูกเรียกใช้ เมื่อตัวเลือกต้องมีการโต้แย้ง, สถานที่ getoptsOPTARGว่าอาร์กิวเมนต์ลงในตัวแปร เชลล์ไม่ได้รีเซ็ตOPTINDgetoptsเมื่อพบตัวเลือกสุดท้ายให้
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และโดยเฉพาะอย่างยิ่งสำหรับ