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)个位置参数