ตัวอย่างเช่นถ้าฉันมีสคริปต์. / foo ที่ใช้พารามิเตอร์ 10 ตัวและฉันต้องการส่งผ่านพารามิเตอร์ที่ 8 เท่านั้น วิธีเดียวที่ฉันรู้วิธีการทำในปัจจุบันคือ:
./foo '' '' '' '' '' '' '' 'bar'
มีวิธีที่ง่ายกว่า / ดีกว่า?
ตัวอย่างเช่นถ้าฉันมีสคริปต์. / foo ที่ใช้พารามิเตอร์ 10 ตัวและฉันต้องการส่งผ่านพารามิเตอร์ที่ 8 เท่านั้น วิธีเดียวที่ฉันรู้วิธีการทำในปัจจุบันคือ:
./foo '' '' '' '' '' '' '' 'bar'
มีวิธีที่ง่ายกว่า / ดีกว่า?
คำตอบ:
อีกวิธีในการทำสิ่งนี้คือตั้งชื่อพารามิเตอร์ที่คุณต้องการประกาศจากนั้นทำดังนี้:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
ในตัวอย่างด้านบนตัวแปรสภาพแวดล้อมที่ประกาศอย่างชัดเจนต้องการให้อาร์กิวเมนต์ของบรรทัดคำสั่ง แต่อาร์กิวเมนต์บรรทัดคำสั่งจะใช้เมื่อตัวแปรสภาพแวดล้อมว่างเปล่าหรือไม่ได้ตั้งค่า เมื่อทั้งสองตำแหน่งที่ 8 และตัวแปรสภาพแวดล้อม$eight
ที่ว่างเปล่าหรือล้างค่าค่าเริ่มต้นsome_default$eight
ได้รับมอบหมายให้ ในทั้งสองกรณี:
สามารถลบออกจาก:-
หรือ:=
ข้อความถ้าว่างควรเป็นค่าที่ยอมรับได้
ตัวแปร$eight
อาจถูกกำหนดเช่น:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... และบรรทัดก่อนหน้าถูกละเว้นโดยสิ้นเชิง แต่ฉันต้องการแสดงให้เห็นว่าการประกาศตัวแปรด้วยวิธีนั้นจะส่งผลให้เกิดค่าถาวรและดังนั้นฉันจึงทำมันในสองคำสั่ง วิธีใด$eight
ถูกตั้งค่าเป็นค่าสุดท้ายของการขยายพารามิเตอร์ผสม
getopts
- สำหรับสคริปต์ที่แข็งแกร่ง - มักจะเป็นวิธีที่ดีที่สุดที่จะสั่งจับตัวเลือก ในทางกลับกันพารามิเตอร์ตำแหน่งมักเป็นวิธีที่ง่ายที่สุดในการจัดการตัวถูกดำเนินการในสคริปต์
ตัวอย่างเช่น:
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
ที่นั่นเราเห็นตัวถูกดำเนินการที่แปดเท่านั้น แต่มีพวกมัน 101 คนที่โค้งจากไดเรกทอรีทดสอบของฉัน
สมมติว่าคุณสามารถเปลี่ยนสคริปต์คุณควรพิจารณาใช้พารามิเตอร์ทางเลือก (ตัวเลือก) แทนพารามิเตอร์ที่ต้องการ (อาร์กิวเมนต์)
หากคุณมีพารามิเตอร์เป็นเจ็ดตัวแรกแต่ละตัวเลือกและให้พวกเขาเริ่มต้นกับสตริงว่างแล้วคุณสามารถทำได้:
./foo bar
ถ้าคุณใช้เปลือก POSIX ได้คุณสามารถใช้ยูทิลิตี้หรือโปรแกรมgetopts
- ชอบเชลล์มากที่สุด - ข้อเสนอเป็นแบบในตัว ทั้งสองวิธีนั้นง่ายกว่าการเลื่อนโปรแกรมแยกวิเคราะห์บรรทัดคำสั่งของคุณเองgetopt
bash
getopts
ยกเว้นว่าคุณใช้บางอย่างเช่นอาร์กิวเมนต์ X แบบไม่มีตัวเลือกสุดท้ายคือค่าสำหรับอาร์กิวเมนต์ Y ตัวสุดท้ายและอาร์กิวเมนต์ตัวเลือก XY คุณจะต้องระบุสตริงตัวเลือกก่อนสตริง 7 (ว่างเปล่า) แต่ละรายการหากคุณต้องการตั้งค่าใด ๆ อย่างไรก็ตามนี่ไม่ใช่วิธีปฏิบัติทั่วไปโดยปกติแล้วตัวเลือกจะเป็นตัวเลือกและการโต้แย้งโต้แย้งเสมอและลำดับของตัวเลือก "การแทรก" นั้นฟรี
+1
getopt(s)
สำหรับ พารามิเตอร์ตำแหน่งเป็นเวลาที่น่าเศร้าและควรหลีกเลี่ยง