Оболонки з асоціативними масивами
Деякі сучасні оболонки забезпечують асоціативні масиви: ksh93, bash ≥4, zsh. У ksh93 та bash, якщо a
це асоціативний масив, то "${!a[@]}"
це масив його ключів:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
У zsh цей синтаксис працює лише в режимі емуляції ksh. Інакше вам доведеться використовувати рідний синтаксис zsh:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
також працює, якщо a
не має порожнього ключа.
У zsh ви також можете одночасно k
переходити до циклу на eys та v
alues:
for k v ("${(@kv)a}") echo "$k -> $v"
Оболонки без асоціативних масивів
Емуляція асоціативних масивів у оболонках, які їх не мають, - це значно більша робота. Якщо вам потрібні асоціативні масиви, ймовірно, настав час залучити більший інструмент, наприклад ksh93 або Perl.
Якщо вам потрібні асоціативні масиви в простої оболонці POSIX, ось спосіб їх моделювання, коли ключі обмежені, щоб містити лише символи 0-9A-Z_a-z
(ASCII цифри, букви та підкреслення). За цим припущенням, ключі можуть використовуватися як частина імен змінних. Наведені нижче функції діють на масив, ідентифікований префіксом імен, "стовбур", який не повинен містити двох послідовних підкреслення.
## 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"
}
(Попередження, неперевірений код. Виявлення помилок для синтаксично недійсних стовбурів та ключів не надається.)