ฉันจะส่งต่อพารามิเตอร์ไปยังคำสั่งอื่นในสคริปต์ทุบตีได้อย่างไร


165

ภายในสคริปต์ทุบตีของฉันฉันต้องการแยกพารามิเตอร์หนึ่งหรือสองพารามิเตอร์ (สคริปต์สามารถจดจำได้) จากนั้นส่งต่อพารามิเตอร์ที่เหลือไปยังคำสั่งที่เรียกใช้ในสคริปต์ ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


239

ใช้shiftคำสั่งในตัวเพื่อ "กิน" อาร์กิวเมนต์ จากนั้นเรียกกระบวนการลูกและส่งผ่าน"$@"อาร์กิวเมนต์เพื่อรวมอาร์กิวเมนต์ที่เหลือทั้งหมด สังเกตคำพูดที่พวกเขาควรจะเก็บไว้เพราะพวกเขาทำให้การขยายตัวของรายการอาร์กิวเมนต์ที่จะยกมาอย่างถูกต้อง


23
จริง ๆ แล้ว "$ @" ปลอดภัยกว่า $ *
pixelbeat

1
@pixelbeat: ขอบคุณจับที่ดี ฉันแก้ไข @ Łukasz Lew: ดูหน้าเชื่อมโยงไปยังในคู่มือ :) โดยทั่วไปมันจัดการกับข้อความที่ดีกว่า
คลาย

22
$@โดยพื้นฐานแล้วถือว่าแต่ละองค์ประกอบของอาร์เรย์เป็นสตริงที่ยกมา - พวกเขาจะถูกส่งผ่านไปโดยไม่มีโอกาสสำหรับการขยายตัว นอกจากนี้ยังรับประกันว่าแต่ละคำจะถูกมองว่าเป็นคำแยก คำอธิบายนี้พร้อมกับสคริปต์ทดสอบที่แสดงให้เห็นถึงความแตกต่างอยู่ที่นี่: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel

2
ให้ความสนใจกับการใช้คำพูด! อ่านเพิ่มเติมว่าเพราะเหตุใดจึงสำคัญที่นี่: stackoverflow.com/a/4824637/4575793
Cadoiz

32

bash ใช้คำสั่งshift :

เช่น shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 สร้าง

1
2 3

2
@ TamásZaholaสนใจที่จะอธิบาย?
Kyle Chadha

2
หากคุณส่งต่อข้อโต้แย้ง$1โดยไม่ต้องพูดถึงมัน"$1"เชลล์จะทำการแยกคำดังนั้นเช่นfoo barจะถูกส่งต่อเป็นfooและbarแยกกัน
Tamás Zahola

อ่านเพิ่มเติมเกี่ยวกับสาเหตุที่มีคู่ "อยู่ที่นี่: stackoverflow.com/a/4824637/4575793
Cadoiz

1
สมองของฉันสั่นสะเทือนตัวอักษรสองสามตัวใน "shifttest" และฉันก็อ่านมันเป็นอย่างอื่น
อเล็กซ์

21

Bash รองรับพารามิเตอร์การตั้งค่าย่อย (ดูชุดย่อยและสตริงย่อย ) ดังนั้นคุณสามารถเลือกพารามิเตอร์ที่จะดำเนินการ / ผ่านเช่นนี้

  1. เปิดไฟล์ใหม่และแก้ไข: 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}"
  2. เรียกใช้มัน:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. ผลลัพธ์คือ:

    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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.