ส่งผ่านพารามิเตอร์บรรทัดคำสั่งไปยังโปรแกรมภายในเชลล์สคริปต์


15

ในฐานะที่เป็น./script.sh arg1 [arg2 arg3 ...]ข้อโต้แย้งบรรทัดคำสั่งarg1, arg2... สามารถได้โดย$1, $2... แต่จำนวนของการขัดแย้งจะไม่ได้รับการแก้ไข

ในเชลล์สคริปต์ฉันต้องการส่งอาร์กิวเมนต์ที่เริ่มต้นจากarg2ไปยังโปรแกรม

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

ฉันจะทำอย่างไรเพราะอาจมีข้อโต้แย้งอย่างน้อยหนึ่งข้อ

คำตอบ:


17

วิธีปกติคือการบันทึกสำเนาของarg1 ( "$1") และเลื่อนพารามิเตอร์โดยหนึ่งดังนั้นคุณสามารถดูรายการทั้งหมดเป็น"$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

ทุบตีมีการสนับสนุนอาร์เรย์แน่นอน แต่มันไม่จำเป็นสำหรับคำถามตามที่วาง

หากarg1เป็นตัวเลือกคุณจะตรวจสอบดังนี้:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

จำเป็นต้องใช้เครื่องหมายคำพูดคู่$@หรือไม่เมื่อใช้งาน?
ลี

1
เครื่องหมายอัญประกาศคู่พร้อม$@บอกให้เชลล์อัญประกาศแต่ละพารามิเตอร์ (สิ่งที่ดีที่ต้องทำถ้าพารามิเตอร์มีอักขระที่น่าสนใจเช่นวงเล็บหรือเครื่องหมายดอกจัน) หากคุณไม่สนใจสิ่งนั้น$*งานธรรมดา ๆ...
โธมัสดิกกี

6
@ ใช่ใช่จำเป็นต้องใช้เครื่องหมายคำพูดคู่ มิฉะนั้นแทนที่จะส่งผ่านรายการอาร์กิวเมนต์แต่ละอาร์กิวเมนต์จะแยกกันที่ช่องว่างจากนั้นแต่ละชิ้นจะถูกตีความว่าเป็นรูปแบบสัญลักษณ์แทนและหากรูปแบบตรงกันนั้นจะถูกแทนที่ด้วยรายการการแข่งขัน โดยทั่วไปการพูดเสมอแทนตัวแปรราคาคู่
Gilles 'หยุดความชั่วร้าย' ใน

10

คุณสามารถแบ่งพารามิเตอร์ตำแหน่งโดยใช้การขยายพารามิเตอร์ ไวยากรณ์คือ:

${parameter:offset:length}

หากlengthไม่ได้ใส่ค่าไว้มันจะถูกใช้จนเป็นค่าสุดท้าย

ในขณะที่คุณต้องผ่านจากการโต้แย้งครั้งที่สองถึงครั้งสุดท้ายคุณต้อง:

${@:2}

ตัวอย่าง:

$ foo() { echo "${@:2}" ;}

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