Bash编程中declare -a与declare -A声明数组的区别是什么?
Bash 中
declare -a 与 declare -A 声明数组的区别 你给出的高斯消元脚本片段如下:
declare -A matrix declare -a res read_matrix() { local i=0 local line local j while read -r line; do j=0 IFS=, for v in $(echo "$line") do matrix[$i,$j]="$v" j=$((j+1)) done i=$((i+1)) done }
脚本里res用declare -a声明、matrix用declare -A声明,二者的核心区别如下:
- 支持的数组类型不同
declare -a声明的是索引数组(Indexed Array),是Bash 3.0及以上版本内置的基础数组类型,只能用非负整数作为数组下标。declare -A声明的是关联数组(Associative Array),仅Bash 4.0及以上版本支持,可以用任意字符串作为数组下标,脚本里matrix[$i,$j]就是把i,j拼接成的字符串作为键,模拟二维数组的存储效果,这种用法索引数组无法实现。
- 声明要求不同
- 索引数组无需提前声明,直接赋值比如
arr[0]=1就会自动创建索引数组,declare -a属于可选的显式声明。 - 关联数组必须提前用
declare -A显式声明,未声明直接写类似matrix[0,1]的赋值语句时,Bash会把内容当成算术表达式处理,逗号会被识别为算术运算符,最终取最后一个值1作为索引数组的下标,完全不符合预期。
- 索引数组无需提前声明,直接赋值比如
- 存储与遍历逻辑不同
- 索引数组的下标默认从0开始,支持非连续的整数下标,遍历
${!arr[@]}拿到的是整数序列的下标。 - 关联数组内部基于哈希表存储,无下标顺序要求,遍历
${!arr[@]}拿到的是存入时的字符串键,比如上述脚本中遍历matrix的键拿到的就是0,0、0,1这类拼接字符串。
- 索引数组的下标默认从0开始,支持非连续的整数下标,遍历
内容的提问来源于stack exchange,提问作者AshGi
相关产品推荐
相关产品推荐

