การส่งผ่านอาร์กิวเมนต์ด้วยช่องว่างระหว่างสคริปต์ (bash)


94

ฉันมี bash สองสคริปต์ต่อไปนี้

เถ้า:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

ไบนารี someApp รับ$*เป็น 2 อาร์กิวเมนต์ ('My' และ 'Argument') แทนที่จะเป็น 1

ฉันได้ทดสอบหลายสิ่ง:

  • การเรียกใช้ someApp ผ่านการb.shทำงานตามที่คาดไว้เท่านั้น
  • ทำซ้ำ + สะท้อนอาร์กิวเมนต์ในการb.shทำงานตามที่คาดไว้
  • การใช้$@แทน$*ไม่ได้สร้างความแตกต่าง

6
ลองsomeApp "$*"หรือsomeApp "$@"
Russell Uhl

1
Yupp - ทำงานอย่างมีเสน่ห์!
John Fear

คำตอบ:


152

$*ไม่ได้ใส่เครื่องหมายคำพูดขยายเป็นสองคำ คุณต้องอ้างเพื่อให้someAppได้รับอาร์กิวเมนต์เดียว

someApp "$*"

เป็นไปได้ว่าคุณต้องการใช้$@แทนดังนั้นsomeAppจะได้รับสองอาร์กิวเมนต์หากคุณต้องการโทรb.shเป็น

b.sh 'My first' 'My second'

ด้วยsomeApp "$*", จะได้รับอาร์กิวเมนต์เดียวsomeApp My first My secondด้วยsomeApp "$@", someAppจะได้รับทั้งสองมีปากเสียงและMy firstMy second


25
คีย์ที่พลาดง่ายคือต้องยก "$ @" $ @ ไม่เพียงพอ
miracle2k

1
@ miracle2k ถูกต้อง. ไม่ได้อ้างสิทธิ์$@และ$*ทำงานเหมือนกัน
chepner

2
@Matt นั่นคือสิ่งที่แตกต่างอย่างสิ้นเชิง "$ @" มีความพิเศษตรงที่ระบุแต่ละอาร์กิวเมนต์ ซึ่งอาจส่งผลให้เกิดข้อโต้แย้งมากกว่าหนึ่งข้อ "$ something" เป็นเพียงเครื่องหมายคำพูดของสิ่งที่ $ ขยายไปและจะเป็นอาร์กิวเมนต์เดียวเสมอ
Carlo Wood

IFS=$'\n'คำตอบที่ทำงานเฉพาะสำหรับฉันว่าฉันชุด ไม่รู้ว่าทำไม
Dominic M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.