Saya memiliki fungsi berikut:
bar() { echo $1:$2; }
Saya memanggil fungsi ini dari fungsi lainfoo
,. foo
itu sendiri disebut sebagai berikut:
foo "This is" a test
Saya ingin mendapatkan hasil sebagai berikut:
This is:a
Artinya, argumen yang bar
menerima harus sama dengan token yang saya berikan foo
.
Bagaimana foo
perlu 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?
Jawaban:
Gunakan
"$@"
:"$@"
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).sumber
$*
ada semantik ini - sekarang ini logis. Saya pikir jawaban ini sebenarnya memecahkan masalah lain yang saya alami ketika mengulangi array ...Anda harus menggunakan
$@
, bukan$*
ouput
Mengapa ini berhasil?
Karena dengan
$*
, semua parameter dilihat sebagai satu kata , artinya Anda akan beralihThis is a test
kebar
fungsi. Dalam hal ini, parameter pertama lolos ke bilah fungsi adalahThis
, 2 adalahis
.Dengan
$@
, setiap parameter adalah string yang dikutip , artinya Anda akan beralih'This is'
'a'
'test'
kebar
fungsi. Jadi parameter pertama lolos ke bilah fungsi adalahThis is
, 2 adalaha
.sumber