bash中的数组

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. $1:返回数组第几个元素(从0开始)
  2. 2" {array[@]}”把数组元素转换成”array[0]” “array[1]” … “array[n-1]”,可以正确处理数组元素中有空格的情况。实际上函数接受了1+len(array)个位置参数

偏移关系:array[0]是 22 {!(i+2)}为array[i]

3.2 两个数组

get_nth_array_element的位置参数含义:

  1. 1array1[ 1]
  2. 2array2[ 2]
  3. $3:len(array1)
  4. $4:array1[0]
  5. $(n+4):array2[0]

偏移关系: 3n 4- n+41 (n+4)就是第二个数组[0]元素

3.3 eval

#获得第n个数组的[m]索引元素
eval var=\${$n[m]}

3.4 获得函数nth的位置参数(补充)

  • !nnn n功能相同。n也可以是一个变量,获得指定位置的参数,n前面不用加$。
  • ${!n}中的n不能是表达式,如果第几个参数需要通过计算得到,那么把计算结果保存到一个局部变量i中,然后{!i}获取参数。

参考

  1. How to define hash tables in bash?
  2. Passing multiple distinct arrays to a shell function
  3. How to get the nth positional argument in bash?

你可能感兴趣的:(Shell)