Saya melihat trik untuk mengimplementasikan array asosiatif dalam skrip shell. Misalnya print array["apples"]
bisa dituliskan sebagai echo \$array$key
mana kunci = apel.
Namun, tidak disebutkan bagaimana menghasilkan kunci untuk beralih di atas array. Satu-satunya cara saya bisa memikirkan adalah untuk menyimpan kunci dalam variabel yang dibatasi oleh spasi sehingga saya bisa menggunakan for-loop untuk beralih pada array.
Jadi, apakah ada cara lain untuk menyimpan kunci untuk digunakan nanti?
shell-script
associative-array
Orang terpelajar
sumber
sumber
Jawaban:
Kerang dengan array asosiatif
Beberapa shell modern menyediakan array asosiatif: ksh93, bash ≥4, zsh. Di ksh93 dan bash, if
a
adalah array asosiatif, maka"${!a[@]}"
adalah array kuncinya:Di zsh, sintaks itu hanya berfungsi dalam mode emulasi ksh. Kalau tidak, Anda harus menggunakan sintaks asli zsh:
${(k)a}
juga berfungsi jikaa
tidak memiliki kunci kosong.Di zsh, Anda juga bisa mengulangi kedua mata
k
danv
mata sekaligus:Kerang tanpa array asosiatif
Meniru array asosiatif dalam cangkang yang tidak memilikinya jauh lebih banyak pekerjaan. Jika Anda membutuhkan array asosiatif, mungkin inilah saatnya untuk membawa alat yang lebih besar, seperti ksh93 atau Perl.
Jika Anda membutuhkan array asosiatif dalam shell POSIX belaka, inilah cara untuk mensimulasikannya, ketika kunci dibatasi untuk hanya memuat karakter
0-9A-Z_a-z
(ASCII digit, huruf, dan garis bawah). Di bawah asumsi ini, kunci dapat digunakan sebagai bagian dari nama variabel. Fungsi di bawah ini bekerja pada array yang diidentifikasi oleh awalan penamaan, "batang", yang tidak boleh berisi dua garis bawah berturut-turut.(Peringatan, kode yang belum diuji. Deteksi kesalahan untuk batang dan kunci secara sintaksis tidak disediakan.)
sumber
Saya tidak yakin apa yang Anda maksud dengan toko, tetapi Anda dapat beralih menggunakan kunci menggunakan
${!array[@]}
sintaks:Jadi, untuk beralih:
Saya menemukan tutorial singkat yang bagus tentang ini di sini .
Seperti yang ditunjukkan dalam komentar di bawah ini, array asosiatif ditambahkan dalam
bash
versi 4. Lihat di sini untuk artikel jurnal Linux tentang masalah ini.sumber
(bash version 4 only)
Itu hal yang penting untuk diperhatikan. Secara tradisional,bash
array hanya numerik.typeset
bukandeclare
dalam contoh Anda. Itu akan membuatnya portabel antara bash 4 dan ksh93 yang pertama kali mengimplementasikan array asosiatif shell.Kerang tanpa array asosiatif
Tidak sulit ketika tombol dibatasi
[0-9A-Za-z_]
(angka, huruf, garis bawah).Caranya adalah alih-alih menyimpan ke array [ $ key ], simpan ke variabel array_ $ key .
Set:
Dapatkan:
Catatan: Nilai tidak dapat mengandung
'
(kutipan tunggal).sumber
ini bekerja di bash
ATAU
Tidak perlu menggunakan eval afaik
sumber