ส่งผ่านข้อโต้แย้งไปยังฟังก์ชั่นตรงตามที่เป็นอยู่


10

ฉันมีฟังก์ชั่นต่อไปนี้:

bar() { echo $1:$2; }

ฉันกำลังเรียกฟังก์ชั่นนี้จากฟังก์ชั่นอื่น , foo. fooตัวเองเรียกว่าดังนี้:

foo "This is" a test

ฉันต้องการรับผลลัพธ์ต่อไปนี้:

This is:a

นั่นคือข้อโต้แย้งที่ได้รับควรจะราชสกุลเดียวกันกับที่ผมผ่านเข้าไปbarfoo

จะfooต้องมีการดำเนินการอย่างไรเพื่อให้บรรลุเป้าหมายนี้? ฉันได้ลองใช้งานสองแบบต่อไปนี้ แต่ก็ไม่ได้ผล:

  • foo() { bar $*; }

    - เอาท์พุท: this:is

  • foo() { bar "$*"; }

    - เอาท์พุท: this is a test:

คำถามของฉันคือวิธีที่ฉันสามารถรักษาข้อโต้แย้ง เป็นไปได้ทั้งหมดหรือไม่


คำตอบ:


14

ใช้"$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"และ"$*"มีความหมายพิเศษ:

  • "$@"ขยายออกเป็นหลายคำโดยไม่ทำการขยายคำ (เช่น"$1" "$2" ...)
  • "$*" รวมพารามิเตอร์ตำแหน่งกับอักขระตัวแรกใน IFS (หรือเว้นวรรคหาก IFS ไม่ได้ตั้งค่าหรือไม่มีอะไรเลยหาก IFS ว่างเปล่า)

ขอบคุณฉันไม่ทราบว่า$*มีความหมายนี้ - ตอนนี้มันเป็นตรรกะ ผมคิดว่าคำตอบนี้จริงแก้ปัญหาอีกผมได้รับมีมากกว่าเมื่อ iterating อาร์เรย์ ...
คอนราดรูด

6

คุณต้องใช้$@แทน$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

ouput

This is:a

ทำไมมันทำงาน

เพราะด้วย$*พารามิเตอร์ทั้งหมดถูกมองว่าเป็นคำเดียวหมายความว่าคุณจะส่งผ่านThis is a testไปยังbarฟังก์ชั่น ในกรณีนี้พารามิเตอร์ผ่านครั้งที่ 1 ไปที่บาร์ฟังก์ชั่นThisที่ 2 isคือ

ด้วย$@พารามิเตอร์แต่ละตัวเป็นสตริงที่ยกมาหมายความว่าคุณจะผ่าน'This is' 'a' 'test'ไปยังbarfuntion ดังนั้นพารามิเตอร์ผ่านครั้งที่ 1 ไปที่บาร์ฟังก์ชั่นThis isที่ 2 aคือ

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