ภายในสคริปต์ทุบตีของฉันฉันต้องการแยกพารามิเตอร์หนึ่งหรือสองพารามิเตอร์ (สคริปต์สามารถจดจำได้) จากนั้นส่งต่อพารามิเตอร์ที่เหลือไปยังคำสั่งที่เรียกใช้ในสคริปต์ ฉันจะทำสิ่งนั้นได้อย่างไร
ภายในสคริปต์ทุบตีของฉันฉันต้องการแยกพารามิเตอร์หนึ่งหรือสองพารามิเตอร์ (สคริปต์สามารถจดจำได้) จากนั้นส่งต่อพารามิเตอร์ที่เหลือไปยังคำสั่งที่เรียกใช้ในสคริปต์ ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
ใช้shift
คำสั่งในตัวเพื่อ "กิน" อาร์กิวเมนต์ จากนั้นเรียกกระบวนการลูกและส่งผ่าน"$@"
อาร์กิวเมนต์เพื่อรวมอาร์กิวเมนต์ที่เหลือทั้งหมด สังเกตคำพูดที่พวกเขาควรจะเก็บไว้เพราะพวกเขาทำให้การขยายตัวของรายการอาร์กิวเมนต์ที่จะยกมาอย่างถูกต้อง
$@
โดยพื้นฐานแล้วถือว่าแต่ละองค์ประกอบของอาร์เรย์เป็นสตริงที่ยกมา - พวกเขาจะถูกส่งผ่านไปโดยไม่มีโอกาสสำหรับการขยายตัว นอกจากนี้ยังรับประกันว่าแต่ละคำจะถูกมองว่าเป็นคำแยก คำอธิบายนี้พร้อมกับสคริปต์ทดสอบที่แสดงให้เห็นถึงความแตกต่างอยู่ที่นี่: tldp.org/LDP/abs/html/internalvariables.html#APPREF
bash ใช้คำสั่งshift :
เช่น shifttest.sh:
#!/bin/bash
echo $1
shift
echo $1 $2
shifttest.sh 1 2 3 สร้าง
1
2 3
$1
โดยไม่ต้องพูดถึงมัน"$1"
เชลล์จะทำการแยกคำดังนั้นเช่นfoo bar
จะถูกส่งต่อเป็นfoo
และbar
แยกกัน
Bash รองรับพารามิเตอร์การตั้งค่าย่อย (ดูชุดย่อยและสตริงย่อย ) ดังนั้นคุณสามารถเลือกพารามิเตอร์ที่จะดำเนินการ / ผ่านเช่นนี้
เปิดไฟล์ใหม่และแก้ไข: vim r.sh
:
echo "params only 2 : ${@:2:1}"
echo "params 2 and 3 : ${@:2:2}"
echo "params all from 2: ${@:2:99}"
echo "params all from 2: ${@:2}"
เรียกใช้มัน:
$ chmod u+x r.sh
$ ./r.sh 1 2 3 4 5 6 7 8 9 10
ผลลัพธ์คือ:
params only 2 : 2
params 2 and 3 : 2 3
params all from 2: 2 3 4 5 6 7 8 9 10
params all from 2: 2 3 4 5 6 7 8 9 10