关联数组 (associative arrays)
- 什么是关联数组
关联数组是支持下标不是数字的数组,比如字符串。
- 关联数组的定义
关联数组必须通过"-A"显式的定义:typeset -A MYARR
如果没有显式定义的话,那么就是一个普通数组,普通数组不支持字符串下标。
- 关联数组的定义例子
typeset -A MYARR=([aa]=AA [bb]=BB [cc]=CC [dd]=DD [ee]=EE)
echo "["${!MYARR[@]}"]" # [dd aa ee bb cc]
echo "["${MYARR[@]}"]" # [DD AA EE BB CC]
这个地方有一点疑问的是,关联数组是按什么顺序排序的?因为我们看到输出并没有按照aa,bb,cc,dd,ee的顺序输出。答案是:关联数组并不是按照字母顺序排列的,也不是按照定义的顺序排列的,而是根据hash值排列的,所以简单的说,关联数组并不是按照通常可见的顺序排列的;如果用户需要排序,那么必须使用普通数组,或者使用其他的替代方法,例如两个数组模拟的方法。
或者:
typeset -A MYARR
MYARR[aa]=AA
MYARR[bb]=BB
MYARR[cc]=CC
MYARR[dd]=DD
MYARR[ee]=EE
echo "["${!MYARR[@]}"]" # [dd aa ee bb cc]
echo "["${MYARR[@]}"]" # [DD AA EE BB CC]
如果没有显示的定义成关联数组,那么就当普通数组处理:
MYARR[aa]=AA
MYARR[bb]=BB
MYARR[cc]=CC
MYARR[dd]=DD
MYARR[ee]=EE
echo "["${!MYARR[@]}"]" # [0]
echo "["${MYARR[@]}"]" # [EE]
或者
typeset -a MYARR
MYARR[aa]=AA
MYARR[bb]=BB
MYARR[cc]=CC
MYARR[dd]=DD
MYARR[ee]=EE
echo "["${!MYARR[@]}"]" # [0]
echo "["${MYARR[@]}"]" # [EE]
因为"-a"定义的是普通数组。
或者:
MYARR=([aa]=AA [bb]=BB [cc]=CC [dd]=DD [ee]=EE)
echo "["${!MYARR[@]}"]" # [0]
echo "["${MYARR[@]}"]" # [EE]
MYARR也是普通数组。
MYARR=([aa]=AA [bb]=BB [cc]=CC [dd]=DD [ee]=EE)
echo "["${!MYARR[@]}"]" # [0]
echo "["${MYARR[@]}"]" # [EE]
- 关联数组的引用
关联数组的使用和普通数组是一样的。
typeset -A MYARR=([aa]=AA [bb]=BB [cc]=CC [dd]=DD [ee]=EE)
echo "["${MYARR[aa]}"]" # [AA]
echo "["${MYARR[ee]}"]" # [EE]