Anggap saya memiliki array yang sangat besar $large_list
, adakah cara untuk menulis fungsi yang akan menggunakan array sebagai argumen? Sebagai contoh:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
Apa strategi yang biasa dilakukan untuk melakukan hal seperti itu? Saya mencoba memberikan variabel $large_list
tetapi itu kosong.
Saya bersedia mengubah fungsi untuk menyesuaikannya dengan perubahan apa pun dalam daftar argumen.
Sebagai catatan, saya menggunakan ksh88, dan saya mencari jawaban yang portabel.
EDIT : Sejauh ini yang terbaik yang bisa saya lakukan adalah untuk loop melalui array dan mengirim setiap elemen sebagai argumen ke fungsi. Ini tampaknya sangat jelek dan rawan kesalahan, belum lagi pasti akan mencapai batas tertentu dengan cepat. Inilah yang saya lakukan:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
Apakah tidak ada yang lebih baik untuk dilakukan?
func "${array[@]}"
? Jika Anda hanya perlu melewati satu elemen, cukup lewat elemen - tidak perlu membuatnya lebih berbelit-belit dengan melewatkan array dan indeks."${array[$@]}
. Saran Anda benar-benar berfungsi. MEA Culpa.Jawaban:
Untuk meneruskan elemen array sebagai argumen ke fungsi, gunakan sintaks ksh untuk memperluas elemen array sebagai daftar.
The
[@]
akhiran membuat ini ekspansi larik. Kutipan ganda melindungi setiap elemen dari ekspansi lebih lanjut (pemisahan dan globbing). Hasil ekspansi tidak secara umum satu kata seperti biasanya dengan tanda kutip ganda, tetapi kata-kata sebanyak elemen dalam array.The N th elemen dari array kemudian . Untuk mengaksesnya, Anda perlu menggunakan ; lihat Menggunakan referensi variabel "di dalam" variabel lain
${N}
eval
sumber
myarray=("hello world" wibble)
(2 elemen, yang pertama berisi spasi):work_on_array "${myarray[@]}"
melewati 2 parameterhello world
danwibble
;work_on_array ${myarray[@]}
melewati 2 parameterhello
,world
danwibble
. Dan denganmyarray=(*)
,work_on_array ${myarray[@]}
melewati daftar file di direktori saat ini. (Karenanya ini adalah salah satu dari banyak kasus di mana saran saya membuat perbedaan praktis.)hello
,world
danwibble
membuat 3 parameter.)Ada cara di bash 4.3+, yang mungkin berasal dari ksh:
Lihat juga
declare -n
.sumber
Tergantung pada Korn Shell ... AT&T ksh93 dan mksh versi terbaru mendukung ini:
Dalam shell saya saat ini, ini tidak menghasilkan "b".
sumber