6. 提取数组序号
${!array[@]}
或${!array[*]}
,可以返回数组的成员序号,即哪些位置是有值的。
$ arr=([5]=a [9]=b [23]=c) $ echo ${!arr[@]} 5 9 23 $ echo ${!arr[*]} 5 9 23
上面例子中,数组的5、9、23号位置有值。
利用这个语法,也可以通过for循环遍历数组。
arr=(a b c d) for i in ${!arr[@]};do echo ${arr[i]} done
7. 提取数组成员
${array[@]:position:length}
的语法可以提取数组成员。
$ food=( apples bananas cucumbers dates eggs fajitas grapes ) $ echo ${food[@]:1:1} bananas $ echo ${food[@]:1:3} bananas cucumbers dates
上面例子中,${food[@]:1:1}
返回从数组1号位置开始的1个成员,${food[@]:1:3}
返回从1号位置开始的3个成员。
如果省略长度参数length,则返回从指定位置开始的所有成员。
$ echo ${food[@]:4} eggs fajitas grapes
上面例子返回从4号位置开始到结束的所有成员。
8. 追加数组成员
数组末尾追加成员,可以使用+=赋值运算符。它能够自动地把值追加到数组末尾。否则,就需要知道数组的最大序号,比较麻烦。
$ foo=(a b c) $ echo ${foo[@]} a b c $ foo+=(d e f) $ echo ${foo[@]} a b c d e f
9. 删除数组
删除一个数组成员,使用unset
命令。
$ foo=(a b c d e f) $ echo ${foo[@]} a b c d e f $ unset foo[2] $ echo ${foo[@]} a b d e f
上面例子中,删除了数组中的第三个元素,下标为2。
将某个成员设为空值,可以从返回值中“隐藏”这个成员。
$ foo=(a b c d e f) $ foo[1]='' $ echo ${foo[@]} a c d e f
上面例子中,将数组的第二个成员设为空字符串,数组的返回值中,这个成员就“隐藏”了。
[!NOTE|style:flat|lable:Mylable|iconVisibility:hidden]
这里是“隐藏”,而不是删除,因为这个成员仍然存在,只是值变成了空值。
$ foo=(a b c d e f) $ foo[1]='' $ echo ${#foo[@]} 6 $ echo ${!foo[@]} 0 1 2 3 4 5
上面代码中,第二个成员设为空值后,数组仍然包含6个成员。
由于空值就是空字符串,所以下面这样写也有隐藏效果,但是不建议这种写法。
$ foo[1]=
上面的写法也相当于“隐藏”了数组的第二个成员。
直接将数组变量赋值为空字符串,相当于“隐藏”数组的第一个成员。
$ foo=(a b c d e f) $ foo='' $ echo ${foo[@]} b c d e f
上面的写法相当于“隐藏”了数组的第一个成员。
unset ArrayName
可以清空整个数组。
$ unset ARRAY $ echo ${ARRAY[*]} <--no output-->
10. 关联数组
Bash 的新版本支持关联数组。关联数组使用字符串而不是整数作为数组索引。
declare -A
可以声明关联数组。
declare -A colors colors["red"]="#ff0000" colors["green"]="#00ff00" colors["blue"]="#0000ff"
关联数组必须用带有-A
选项的declare命令声明创建。相比之下,整数索引的数组,可以直接使用变量名创建数组,关联数组就不行。
访问关联数组成员的方式,几乎与整数索引数组相同。
echo ${colors["blue"]}
参考:
- Unix / Linux - Using Shell Arrays
- Arrays in unix shell?
- Array Basics in Shell Scripting | Set 1
- 阮一峰老师的bash 数组