เมื่อรันเชลล์สคริปต์เป็นไปได้หรือไม่ที่จะส่งพารามิเตอร์ตำแหน่งเฉพาะโดยไม่ต้องป้อนทั้งหมดตามลำดับ


13

ตัวอย่างเช่นถ้าฉันมีสคริปต์. / foo ที่ใช้พารามิเตอร์ 10 ตัวและฉันต้องการส่งผ่านพารามิเตอร์ที่ 8 เท่านั้น วิธีเดียวที่ฉันรู้วิธีการทำในปัจจุบันคือ:

./foo '' '' '' '' '' '' '' 'bar'

มีวิธีที่ง่ายกว่า / ดีกว่า?


1
นี่คือเหตุผลที่โปรแกรมมักใช้ตัวเลือกมากกว่าพารามิเตอร์ตำแหน่งหากคุณมีพารามิเตอร์จำนวนมาก
Barmar

คำตอบ:


4

อีกวิธีในการทำสิ่งนี้คือตั้งชื่อพารามิเตอร์ที่คุณต้องการประกาศจากนั้นทำดังนี้:

{   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 คนที่โค้งจากไดเรกทอรีทดสอบของฉัน


18

สมมติว่าคุณสามารถเปลี่ยนสคริปต์คุณควรพิจารณาใช้พารามิเตอร์ทางเลือก (ตัวเลือก) แทนพารามิเตอร์ที่ต้องการ (อาร์กิวเมนต์)

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

./foo bar

ถ้าคุณใช้เปลือก POSIX ได้คุณสามารถใช้ยูทิลิตี้หรือโปรแกรมgetopts - ชอบเชลล์มากที่สุด - ข้อเสนอเป็นแบบในตัว ทั้งสองวิธีนั้นง่ายกว่าการเลื่อนโปรแกรมแยกวิเคราะห์บรรทัดคำสั่งของคุณเองgetoptbashgetopts

ยกเว้นว่าคุณใช้บางอย่างเช่นอาร์กิวเมนต์ X แบบไม่มีตัวเลือกสุดท้ายคือค่าสำหรับอาร์กิวเมนต์ Y ตัวสุดท้ายและอาร์กิวเมนต์ตัวเลือก XY คุณจะต้องระบุสตริงตัวเลือกก่อนสตริง 7 (ว่างเปล่า) แต่ละรายการหากคุณต้องการตั้งค่าใด ๆ อย่างไรก็ตามนี่ไม่ใช่วิธีปฏิบัติทั่วไปโดยปกติแล้วตัวเลือกจะเป็นตัวเลือกและการโต้แย้งโต้แย้งเสมอและลำดับของตัวเลือก "การแทรก" นั้นฟรี


5
+1getopt(s)สำหรับ พารามิเตอร์ตำแหน่งเป็นเวลาที่น่าเศร้าและควรหลีกเลี่ยง
HalosGhost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.