1 索引数组
#定义:
array=(1 "two" 3 "four")
array[index]=value
#访问数组元素(array必须用大括号括起来):
${array[${index}]}
# 获取数组所有元素(元素之间以空格分隔)
${array[@]}
# 获取数组长度
${#array[@]}
# 按下标遍历
for i in $(seq $((${#array[@]}-1)));
do
echo $i, ${array[$i]};
done
# 按元素遍历(必须加双引号)
for var in "${array[@]}"
注:
- @也可以换成*,建议使用@
- array[“123”]定义的是索引数组,按理说索引数组应该是下标都是整数
- 如果处理数组元素带空格的情况,bash会对”${array[@]}”情况下每个数组元素都加上双引号,确保元素中的空格不会被for识别为元素之间的分隔符
2 关联数组
# 定义
fruit_value=(["apple"]=3 ["an orange"]="three")
fruit_value[index]=value
# 访问数组元素
${fruit_value["apple"]}
${fruit_value["${fruit}"]}
# 获得所有key
${!fruit_value[@]}
# 获得所有value
${fruit_value[@]}
# 按key遍历关联数组
for var in "${!array[@]}"
注:
- 推荐用@,”${!array[*]}”是对整个数组加双引号,而”{!array[@]}”是对每个key加双引号
- 遍历数组时双引号必须加,如果key有空格可以正确分割
- bash 4以上的版本才支持declare -A声明关联数组,bash 3有很多trick的做法,见参考
例:统计文件类型信息。
#!/bin/bash
if [ $# -ne 1 ];
then
echo "Usage: filetype_analyzer.sh path"
exit -1
fi
declare -A types
for file in `ls $1`
do
type=`file $file -b | cut -d, -f1`
let types["$type"]++
#echo $file, $type, ${types[$type]}
done
for type in "${!types[@]}"
do
echo $type ":" ${types["$type"]}
done
3 数组作为函数参数
3.1 一个数组
get_nth_array_element的位置参数含义:
- $1:返回数组第几个元素(从0开始)
- 2:数组," {array[@]}”把数组元素转换成”array[0]” “array[1]” … “array[n-1]”,可以正确处理数组元素中有空格的情况。实际上函数接受了1+len(array)个位置参数
偏移关系:array[0]是 2,因此偏移为2, {!(i+2)}为array[i]
3.2 两个数组
get_nth_array_element的位置参数含义:
- 1:返回array1[ 1]
- 2:返回array2[ 2]
- $3:len(array1)
- $4:array1[0]
- $(n+4):array2[0]
偏移关系: 3表示第一个数组的长度(假设为n), 4- n+4−1的位置参数是第一个数组,这样 (n+4)就是第二个数组[0]元素
3.3 eval
#获得第n个数组的[m]索引元素
eval var=\${$n[m]}
3.4 获得函数nth的位置参数(补充)
- !n:获得第n个函数调用时的实参,n可以是字面常数,此时和 n功能相同。n也可以是一个变量,获得指定位置的参数,n前面不用加$。
- ${!n}中的n不能是表达式,如果第几个参数需要通过计算得到,那么把计算结果保存到一个局部变量i中,然后{!i}获取参数。