#!/bin/bash
arr=([2]=3 [5]=2 [6]=2 [9]=1)
for i in "${!arr[@]}"
do
sum=$((sum+arr[i]))
done
echo $sum
Bash 脚本中,*
和 @
符号在数组上下文中有不同的用途。当使用它们来遍历数组时,必须了解它们之间的区别。
*
(无前置感叹号!
):- 在索引数组(indexed array)中,
"${arr[*]}"
会展开成数组中的所有元素。 - 在关联数组(associative array)中,
"${arr[*]}"
是不合法的,因为关联数组没有连续的索引。
- 在索引数组(indexed array)中,
@
(无前置感叹号!
):- 在索引数组中,
"${arr[@]}"
和"${arr[*]}"
的功能相同,都会展开成数组中的所有元素。 - 在关联数组中,
"${arr[@]}"
同样是不合法的。
- 在索引数组中,
*
(有前置感叹号!
):- 在索引数组中,
"${!arr[*]}"
是不合法的,因为感叹号用于关联数组来获取所有的键。 - 在关联数组中,
"${!arr[*]}"
是错误的写法,正确的应该是"${!arr[@]}"
,它会展开成数组中的所有键。
- 在索引数组中,
@
(有前置感叹号!
):- 在索引数组中,
"${!arr[@]}"
和"${!arr[*]}"
都是不合法的,因为感叹号与@
或*
结合时仅用于关联数组。 - 在关联数组中,
"${!arr[@]}"
会展开成数组中的所有键。
- 在索引数组中,
所以,当遍历关联数组时,应该使用 "${!arr[@]}"
来获取所有的键。