Masalah mendasar di sini adalah bahwa pengembang bash (s) yang mendesain / mengimplementasikan array benar-benar mengacaukan anjing tersebut. Mereka memutuskan ${array}itu hanya ulah ${array[0]}, yang merupakan kesalahan buruk. Terutama ketika Anda menganggap itu ${array[0]}tidak memiliki arti dan mengevaluasi ke string kosong jika tipe array asosiatif.
Menetapkan array mengambil bentuk di array=(value1 ... valueN)mana nilai memiliki sintaks [subscript]=string, sehingga menetapkan nilai langsung ke indeks tertentu dalam array. Ini membuatnya jadi bisa ada dua jenis array, diindeks secara numerik dan hash diindeks (disebut asosiatif array dalam bahasa bash). Itu juga membuatnya sehingga Anda dapat membuat array diindeks numerik jarang. Meninggalkan [subscript]=bagian adalah tangan pendek untuk array yang diindeks secara numerik, dimulai dengan indeks ordinal 0 dan bertambah dengan setiap nilai baru dalam pernyataan penugasan.
Karena itu, ${array}harus mengevaluasi ke seluruh array, indeks, dan semua. Ini harus mengevaluasi kebalikan dari pernyataan penugasan. Setiap tahun ketiga CS mayor harus tahu itu. Dalam hal ini, kode ini akan berfungsi persis seperti yang Anda harapkan:
declare -A foo bar
foo=${bar}
Kemudian, meneruskan array dengan nilai ke fungsi dan menugaskan satu array ke array yang lain akan berfungsi sebagai perintah shell lainnya. Tetapi karena mereka tidak melakukan ini dengan benar, operator penugasan =tidak bekerja untuk array, dan array tidak dapat diteruskan oleh nilai ke fungsi atau ke subshell atau output secara umum ( echo ${array}) tanpa kode untuk mengunyah semuanya.
Jadi, jika itu dilakukan dengan benar, maka contoh berikut akan menunjukkan bagaimana kegunaan array di bash bisa jauh lebih baik:
simple=(first=one second=2 third=3)
echo ${simple}
output yang dihasilkan harus:
(first=one second=2 third=3)
Kemudian, array dapat menggunakan operator penugasan, dan diteruskan oleh nilai ke fungsi dan bahkan skrip shell lainnya. Mudah disimpan dengan mengeluarkan ke file, dan dengan mudah dimuat dari file ke dalam skrip.
declare -A foo
read foo <file
Sayangnya, kami telah dikecewakan oleh tim pengembang pesta superlatif.
Dengan demikian, untuk meneruskan array ke suatu fungsi, sebenarnya hanya ada satu opsi, dan itu adalah menggunakan fitur nameref:
function funky() {
local -n ARR
ARR=$1
echo "indexes: ${!ARR[@]}"
echo "values: ${ARR[@]}"
}
declare -A HASH
HASH=([foo]=bar [zoom]=fast)
funky HASH # notice that I'm just passing the word 'HASH' to the function
akan menghasilkan output berikut:
indexes: foo zoom
values: bar fast
Karena ini lewat referensi, Anda juga dapat menetapkan ke array dalam fungsi. Ya, array yang direferensikan harus memiliki cakupan global, tetapi itu tidak boleh terlalu besar, mengingat ini adalah skrip shell. Untuk meneruskan array indeks asosiatif atau jarang menurut nilai ke suatu fungsi, perlu membuang semua indeks dan nilai ke daftar argumen (tidak terlalu berguna jika array besar) sebagai string tunggal seperti ini:
funky "${!array[*]}" "${array[*]}"
dan kemudian menulis banyak kode di dalam fungsi untuk memasang kembali array.