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:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
Di zsh, sintaks itu hanya berfungsi dalam mode emulasi ksh. Kalau tidak, Anda harus menggunakan sintaks asli zsh:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
juga berfungsi jika a
tidak memiliki kunci kosong.
Di zsh, Anda juga bisa mengulangi kedua mata k
dan v
mata sekaligus:
for k v ("${(@kv)a}") echo "$k -> $v"
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.
## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
eval "echo \"\$__aa__${1}\""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
eval "unset $3
case \$__aa__${1} in
*\" $2 \"*) $3=\$__aa__${1}__$2;;
esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
eval "__aa__${1}__${2}=\$3
case \$__aa__${1} in
*\" $2 \"*) :;;
*) __aa__${1}=\"\${__aa__${1}}$2 \";;
esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
eval "unset __aa__${1}__${2}
case \$__aa__${1} in
*\" $2 \"*) __aa__${1}=\"\${__aa__${1}%%* $2 } \${__aa__${1}#* $2 }\";;
esac"
}
(Peringatan, kode yang belum diuji. Deteksi kesalahan untuk batang dan kunci secara sintaksis tidak disediakan.)