Truyền đối số để hoạt động chính xác như vốn có


10

Tôi có chức năng sau:

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

Tôi đang gọi chức năng này từ chức năng khácfoo ,. foochính nó được gọi như sau:

foo "This is" a test

Tôi muốn nhận được đầu ra sau đây:

This is:a

Đó là, các đối số barnhận được phải giống với các mã thông báo mà tôi chuyển vào foo.

Làm thế nào foođể thực hiện để đạt được điều này? Tôi đã thử hai triển khai sau, nhưng không hoạt động:

  • foo() { bar $*; }

    - đầu ra: this:is

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

    - đầu ra: this is a test:

Câu hỏi của tôi là hiệu quả làm thế nào tôi có thể bảo tồn trích dẫn của các đối số. cái này nó có hoàn toàn có thể xảy ra được không?


Câu trả lời:


14

Sử dụng "$@":

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

"$@""$*"có ý nghĩa đặc biệt:

  • "$@"mở rộng thành nhiều từ mà không thực hiện mở rộng cho các từ (như "$1" "$2" ...).
  • "$*" nối các tham số vị trí với ký tự đầu tiên trong IFS (hoặc khoảng trắng nếu IFS không được đặt hoặc không có gì nếu IFS trống).

Cảm ơn, tôi đã không biết rằng $*có ngữ nghĩa này - bây giờ nó hợp lý. Tôi nghĩ rằng câu trả lời này thực sự giải quyết được một vấn đề khác mà tôi gặp phải khi lặp đi lặp lại trên mảng mảng
Konrad Rudolph

6

Bạn phải sử dụng $@, thay vì$*

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

foo() { bar "$@"; }

foo "This is" a test

đầu ra

This is:a

Tại sao nó hoạt động?

Bởi vì với $*, tất cả các tham số được xem như một từ duy nhất , điều đó có nghĩa là bạn sẽ chuyển This is a testsang barchức năng. Trong trường hợp này, tham số thứ nhất truyền vào thanh chức năng là This, thứ 2 là is.

Với $@, mỗi tham số là một chuỗi được trích dẫn , điều đó có nghĩa là bạn sẽ truyền 'This is' 'a' 'test'cho barfuntion. Vì vậy, tham số thứ nhất truyền vào thanh chức năng là This is, thứ 2 là a.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.