เชลล์สคริปต์: ตัวแปรล้อมรอบพร้อมเครื่องหมายคำพูดเมื่อส่งผ่านเข้าไปในอาร์เรย์?

ฉันมีเชลล์สคริปต์ซึ่งส่วนหนึ่งทำสิ่งนี้:

bundle exec rake parallel[${@:3}];

${@:3} เป็นแบบไดนามิกและอาจเป็นเช่น -p thread11 THREAD=test_thread11 หรือเพียงแค่ @test.feature

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

Bundle exec เรคขนาน ["-p thread11 THREAD=test_thread11"]

ทยอยส่งครับ

Bundle exec เรคขนาน [-p thread11 THREAD=test_thread11]

ซึ่งทำให้งานคราดล้มเหลว

ด้วยคำสั่ง echo ฉันสามารถได้ผลลัพธ์ที่ถูกต้องโดยการทำ

echo "จะใช้คำสั่ง run" บันเดิล exec rake แบบขนาน ["'${@:3}'"]

เป็นไปได้ไหมที่จะล้อมรอบค่าของตัวแปรด้วยเครื่องหมายคำพูดเมื่อส่งผ่านไปยังงาน?


person MisterMan    schedule 15.10.2019    source แหล่งที่มา


คำตอบ (1)


ดูเหมือนว่าคุณต้องการใช้ "${*:3}" แทน ซึ่งจะสร้างคำที่คั่นด้วยช่องว่างคำเดียวจาก 3 อาร์กิวเมนต์ แทนที่จะเป็นชุดคำเดี่ยวๆ หนึ่งคำต่ออาร์กิวเมนต์

person chepner    schedule 15.10.2019
comment
ขอบคุณ! ดูเหมือนว่าจะเป็นเช่นนั้น คุณช่วยบอกฉันได้ไหมว่าสัญกรณ์นั้นเรียกว่าอะไร? ฉันยังใหม่กับการเขียนเชลล์สคริปต์ดังนั้นฉันจะอ่านเรื่องนี้ - person MisterMan; 15.10.2019
comment
@ และ * เป็นพารามิเตอร์พิเศษสองตัวที่แตกต่างกัน (ค้นหาคำนั้นใน man page) $* มีพฤติกรรมปกติมากกว่า ในขณะที่ $@ มีพฤติกรรมพิเศษเมื่อเครื่องหมายคำพูด (ดังนั้นจึงไม่ควรใช้โดยไม่มีเครื่องหมายคำพูดและไม่ค่อยมีในสตริงเครื่องหมายคำพูดที่ใหญ่กว่า) - person chepner; 15.10.2019