ฉันจะได้รับส่วนที่เหลือหลังจากดึงรายการแยกวิเคราะห์โดยใช้ getopts ได้อย่างไร


14

ฉันต้องการแยกอาร์กิวเมนต์สำหรับสคริปต์ทุบตีโดยใช้ getopts แต่ต้องการเข้าถึง args ที่เหลือซึ่งไม่รวมอยู่ในรายการตัวเลือก ตัวอย่างเช่นถ้าฉันมีสาย:

% script -a -b param -c param -d other arguments here

ฉันจะมี:

while getopts "ab:c:d" opt ; do
.
done

วิธีที่ง่ายที่สุดในการรับ "ข้อโต้แย้งอื่น ๆ ที่นี่" ซึ่งควรได้รับการประมวลผลโดย getopts คืออะไร?

คำตอบ:


17

คุณต้องเปลี่ยนเมื่อคุณแยกวิเคราะห์หาเรื่องหรือใส่

เลื่อน $ ((OPTIND -1)) หลังจากคุณแยกวิเคราะห์เสร็จแล้วจัดการในลักษณะปกติเช่น

while getopts "ab:c:d" opt ; do
.
done
shift $(expr $OPTIND - 1 )

while test $# -gt 0; do
  echo $1
  shift
done

1
มันคุ้มค่าที่จะอธิบายว่า $ OPTIND เป็นดัชนีของตัวเลือกถัดไปที่จะต้องพิจารณาหลังจากเรียกใช้ getopts แต่ละครั้ง ดังนั้นคือ $ * มี 3 พารามิเตอร์หลังจากการโทรที่ถูกต้องครั้งแรกคือ 2 และครั้งที่สองคือ 3 หากการโทรไม่ถูกต้องมันจะเลื่อนออกด้วยค่าก่อนหน้า ดังนั้นหากพารามิเตอร์ 1 ไม่ถูกต้อง OPTIND จะเป็น 1 (ดังนั้นตัวอย่างด้านบนจะshift $(expr 1 - 1)ปลอดภัย
sibaz

0

ในตอนท้ายของการแยกวิเคราะห์เมื่อคุณได้เปลี่ยนตัวแปร $ @ มีจุดสิ้นสุดของบรรทัด:

while getopts "ab:c:d" opt ; do
.
done
shift $((OPTIND-1))
OTHERARGS=$@
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.