İlişkilendirilebilir dizili kabuklar
Bazı modern kabuklar ilişkilendirilebilir diziler sağlar: ksh93, bash ≥4, zsh. Ksh93 ve bash'da, eğer a
ilişkilendirilebilir bir dizi ise, o zaman "${!a[@]}"
anahtarlarının dizisidir:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
Zsh'de, bu sözdizimi yalnızca ksh öykünme modunda çalışır. Aksi takdirde, zsh'nin yerel sözdizimini kullanmanız gerekir:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
a
boş bir anahtarı yoksa da çalışır .
k
Zsh'de v
, aynı anda hem gözlerde hem de alüyonda döngü yapabilirsiniz :
for k v ("${(@kv)a}") echo "$k -> $v"
İlişkilendirilebilir dizileri olmayan kabuklar
Onları olmayan kabuklarda ilişkisel diziler taklit etmek çok daha fazla iştir. İlişkilendirilebilir dizilere ihtiyacınız varsa, muhtemelen ksh93 veya Perl gibi daha büyük bir araç getirmenin zamanı gelmiştir.
Yalnızca bir POSIX kabuğunda ilişkilendirilebilir dizilere ihtiyacınız varsa, tuşlar yalnızca karakterleri içerecek şekilde kısıtlandığında 0-9A-Z_a-z
(ASCII rakamları, harfler ve alt çizgi) bunları simüle etmenin bir yolu . Bu varsayım altında, anahtarlar değişken adlarının bir parçası olarak kullanılabilir. Aşağıdaki işlevler, ardışık iki alt çizgi içermemesi gereken bir adlandırma öneki olan “kök” ile tanımlanan bir dizi üzerinde çalışır.
## 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"
}
(Uyarı, test edilmemiş kod. Sözdizimsel olarak geçersiz gövdeler ve anahtarlar için hata tespiti sağlanmamıştır.)