数组的类型

Bash提供了2种数组类型,索引(indexed)和关联(associative)数组。索引数组(下标从0开始)较常用,下面是其的使用。



数组的创建

通过shell内建命令declare显式创建,declare -a array_name;或通过直接给数组元素赋值创建,array_name[subscript]=value。


示例如下:

$ declare -a array_name


$ array_name[0]="a"



数组的初始化

可通过array_name=(value1 ... valuen)方式进行,其中value形式为[subscript]=string。也可通过array_name[subscript]=string,下标加1逐个元素初始化。


示例如下:

$ array_name=([0]="a" [1]="bb" [2]="ccc" [3]="dddd")


该方式还可简化成,array_name=("a" "bb" "ccc" "dddd")。


两者有些许细微的差别,前者可指定下标;后者下标从0开始,且连续的。


$ array_name[0]="a"

$ array_name[1]="bb"

$ array_name[2]="ccc"

$ array_name[3]="dddd"



数组的访问

通过${array_name[subscript]}访问数组元素。


示例如下:

$ echo ${array_name[1]}

bb


若subscript是@和*,其代表了数组的所有元素。


示例如下:

$ echo ${array_name[@]}

a bb ccc dddd


$ echo ${array_name[*]}

a bb ccc dddd


但,要注意两者在双引号中时,表现的不同。


$ for i in "${array_name[@]}"; do echo ${i}.tail; done  

a.tail

bb.tail

ccc.tail

dddd.tail


$ for i in "${array_name[*]}"; do echo ${i}.tail; done 

a bb ccc dddd.tail


通过${#array_name[@]},或${#array_name[*]}获取数组的长度;通过${#array_name[subscript]}获取数组元素的长度。


示例如下:

$ echo ${#array_name[@]}

4

$ echo ${#array_name[*]}

4


$ echo ${#array_name[2]}

3

$ echo ${#array_name[3]}

4


知道了数组的长度,还可以通过第二种for循环访问数组元素。


$ for((i=0;i<=${#array_name[@]}-1;i++)); do echo ${array_name[i]}; done  

a

bb

ccc

dddd



数组的删除

使用内建命令unset,unset array_name删除数组;unset array_name[subscript]删除数组元素。


示例如下:

$ unset array_name[2]


如果再访问到该元素时,显示为空行,其表示元素为unset状态。

$ echo ${array_name[2]}


$


在数组元素有删除的情况下,可能又不知道原始数组的长度,只能通过第一种for循环访问数组。


$ for i in "${array_name[@]}"; do echo $i; done

a

bb

dddd


若知道原始数组的长度为4,也能使用第二种for循环,只是可能要过滤掉unset状态的元素(如何实现呢?)。


$ for((i=0;i<=4-1;i++)); do echo ${array_name[i]}; done                     

a

bb


dddd

$


若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).