Shell với mảng kết hợp
Một số shell hiện đại cung cấp các mảng kết hợp: ksh93, bash 4, zsh. Trong ksh93 và bash, nếu a
là một mảng kết hợp, thì đó "${!a[@]}"
là mảng các khóa của nó:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
Trong zsh, cú pháp đó chỉ hoạt động trong chế độ mô phỏng ksh. Nếu không, bạn phải sử dụng cú pháp riêng của zsh:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
cũng hoạt động nếu a
không có khóa trống.
Trong zsh, bạn cũng có thể lặp trên cả k
eys và v
alues cùng một lúc:
for k v ("${(@kv)a}") echo "$k -> $v"
Vỏ không có mảng kết hợp
Việc mô phỏng các mảng kết hợp trong các shell không có chúng là công việc nhiều hơn. Nếu bạn cần mảng kết hợp, có lẽ đã đến lúc đưa vào một công cụ lớn hơn, chẳng hạn như ksh93 hoặc Perl.
Nếu bạn cần các mảng kết hợp trong vỏ POSIX đơn thuần, đây là cách mô phỏng chúng, khi các khóa bị hạn chế chỉ chứa các ký tự 0-9A-Z_a-z
(chữ số ASCII, chữ cái và dấu gạch dưới). Theo giả định này, các khóa có thể được sử dụng như một phần của tên biến. Các hàm bên dưới hoạt động trên một mảng được xác định bởi tiền tố đặt tên, thân cây thân mật, không được chứa hai dấu gạch dưới liên tiếp.
## 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"
}
(Cảnh báo, mã chưa được kiểm tra. Phát hiện lỗi đối với các thân và khóa không hợp lệ về mặt cú pháp không được cung cấp.)