Saya melihat trik untuk mengimplementasikan array asosiatif dalam skrip Shell. Misalnya print array["apples"]
dapat ditulis sebagai echo $array$key
di mana key=apel.
Namun, tidak disebutkan bagaimana cara menghasilkan kunci untuk mengulangi array.
Satu-satunya cara yang dapat saya pikirkan adalah menyimpan kunci dalam variabel yang dibatasi oleh spasi sehingga saya dapat menggunakan for-loop untuk beralih di atas larik.
Jadi, apakah ada cara lain untuk menyimpan kunci untuk digunakan nanti?
Jawaban yang Diterima:
Shell dengan array asosiatif
Beberapa shell modern menyediakan array asosiatif:ksh93, bash 4, zsh. Di ksh93 dan bash, jika a
adalah larik asosiatif, maka "${!a[@]}"
adalah larik kuncinya:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
Di zsh, sintaks itu hanya berfungsi dalam mode emulasi ksh. Jika 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 mengulang keduanya k
mata dan v
alues pada saat yang sama:
for k v ("${(@kv)a}") echo "$k -> $v"
Shell tanpa array asosiatif
Meniru array asosiatif dalam shell yang tidak memilikinya membutuhkan lebih banyak pekerjaan. Jika Anda membutuhkan array asosiatif, mungkin sudah waktunya untuk membawa alat yang lebih besar, seperti ksh93 atau Perl.
Jika Anda memang membutuhkan array asosiatif dalam shell POSIX belaka, inilah cara untuk mensimulasikannya, ketika kunci dibatasi hanya berisi karakter 0-9A-Z_a-z
(Digit ASCII, huruf dan garis bawah). Di bawah asumsi ini, kunci dapat digunakan sebagai bagian dari nama variabel. Fungsi di bawah ini bekerja pada larik yang diidentifikasi oleh awalan penamaan, "batang", yang tidak boleh berisi dua garis bawah berurutan.
## 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 yang tidak valid secara sintaksis tidak disediakan.)
Terkait:Linux – media lambat – penyetelan cache disk?