Lewati argumen agar berfungsi persis apa adanya

10

Saya memiliki fungsi berikut:

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

Saya memanggil fungsi ini dari fungsi lainfoo ,. fooitu sendiri disebut sebagai berikut:

foo "This is" a test

Saya ingin mendapatkan hasil sebagai berikut:

This is:a

Artinya, argumen yang barmenerima harus sama dengan token yang saya berikan foo.

Bagaimana fooperlu diimplementasikan untuk mencapai ini? Saya sudah mencoba dua implementasi berikut, tetapi tidak berhasil:

  • foo() { bar $*; }

    - output: this:is

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

    - output: this is a test:

Pertanyaan saya secara efektif adalah bagaimana saya bisa mempertahankan kutipan argumen. Apakah ini mungkin?

Konrad Rudolph
sumber

Jawaban:

14

Gunakan "$@":

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

"$@"dan "$*"memiliki arti khusus:

  • "$@"memperluas ke beberapa kata tanpa melakukan ekspansi untuk kata-kata (seperti "$1" "$2" ...).
  • "$*" bergabung dengan parameter posisi dengan karakter pertama di IFS (atau spasi jika IFS tidak disetel atau tidak sama sekali jika IFS kosong).
Lri
sumber
Terima kasih, saya tidak tahu $*ada semantik ini - sekarang ini logis. Saya pikir jawaban ini sebenarnya memecahkan masalah lain yang saya alami ketika mengulangi array ...
Konrad Rudolph
6

Anda harus menggunakan $@, bukan$*

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

foo() { bar "$@"; }

foo "This is" a test

ouput

This is:a

Mengapa ini berhasil?

Karena dengan $*, semua parameter dilihat sebagai satu kata , artinya Anda akan beralih This is a testke barfungsi. Dalam hal ini, parameter pertama lolos ke bilah fungsi adalah This, 2 adalah is.

Dengan $@, setiap parameter adalah string yang dikutip , artinya Anda akan beralih 'This is' 'a' 'test'ke barfungsi. Jadi parameter pertama lolos ke bilah fungsi adalah This is, 2 adalah a.

cuonglm
sumber