Shells mit assoziativen Arrays
Einige moderne Shells bieten assoziative Arrays: ksh93, bash ≥4, zsh. Wenn a
es sich in ksh93 und bash um ein assoziatives Array handelt, "${!a[@]}"
handelt es sich um das Array seiner Schlüssel:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
In zsh funktioniert diese Syntax nur im ksh-Emulationsmodus. Andernfalls müssen Sie die native Syntax von zsh verwenden:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
funktioniert auch, wenn a
kein leerer Schlüssel vorhanden ist.
In zsh können Sie auch gleichzeitig k
Eys und v
Alues durchlaufen:
for k v ("${(@kv)a}") echo "$k -> $v"
Shells ohne assoziative Arrays
Das Emulieren von assoziativen Arrays in Shells, die sie nicht haben, ist viel mehr Arbeit. Wenn Sie assoziative Arrays benötigen, ist es wahrscheinlich an der Zeit, ein größeres Tool wie ksh93 oder Perl einzuführen.
Wenn Sie assoziative Arrays in einer reinen POSIX-Shell benötigen, können Sie diese auf folgende Weise simulieren, wenn die Schlüssel nur die Zeichen 0-9A-Z_a-z
(ASCII-Ziffern, Buchstaben und Unterstriche) enthalten. Unter dieser Annahme können Schlüssel als Teil von Variablennamen verwendet werden. Die folgenden Funktionen wirken auf ein Array, das durch ein Namenspräfix, den „Stamm“, gekennzeichnet ist, der keine zwei aufeinander folgenden Unterstriche enthalten darf.
## 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"
}
(Warnung, nicht getesteter Code. Fehlererkennung für syntaktisch ungültige Stämme und Schlüssel wird nicht bereitgestellt.)