以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。
前言
(1)和其他编程语言一样,Shell 也支持数组,但仅支持一维数组而不支持多维数组,并且没有限定数组的大小。
(2)类似与C语言,数组元素的下标由0开始编号。
(3)获取数组中的元素要利用下标[ ],下标可以是整数或算术表达式,其值大于或等于0。
一、数组的定义
(1)在Shell中用括号来表示数组,数组元素用“空格”符号分割开:
array_name=(value1 ... valuen)
(2)Shell 是弱类型的,它并不要求所有数组元素的类型必须相同。下面例子中第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。
arr=(20 56 "http://c.biancheng.net/shell/")
(3)Shell 数组的长度不是固定的,定义之后还可以增加元素。例如,对于上面的arr数组,它的长度是 3,使用下面的代码会在最后增加一个元素,使其长度扩展到 4:
arr[3]="abcdedfg"
(4)此外可以只给特定元素赋值,无需逐个元素地给数组赋值。如下所示,以下代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。
ages=([3]=24 [5]=19 [10]=12)
二、获取某个数组元素
(1)读取数组元素值的一般格式如下,其中array_name 是数组名,index 是下标。
${array_name[index]}
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/sh NAME[0]="Zara" NAME[1]="Qadir" NAME[2]="Mahnaz" NAME[3]="Ayan" NAME[4]="Daisy" echo "First Index: ${NAME[0]}" echo "Second Index: ${NAME[1]}" xjh@ubuntu:~/iot/tmp$ ./test.sh First Index: Zara Second Index: Qadir xjh@ubuntu:~/iot/tmp$
(2)使用@ 或 * 可以获取数组中的所有元素。
${array_name[*]} ${array_name[@]}
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/sh NAME[0]="Zara" NAME[1]="Qadir" NAME[2]="Mahnaz" NAME[3]="Ayan" NAME[4]="Daisy" echo "First Method: ${NAME[*]}" NAME[10]="XJH" echo "Second Method: ${NAME[@]}" xjh@ubuntu:~/iot/tmp$ ./test.sh First Method: Zara Qadir Mahnaz Ayan Daisy Second Method: Zara Qadir Mahnaz Ayan Daisy XJH xjh@ubuntu:~/iot/tmp$
三、获取数组的长度
(1)所谓数组长度,就是数组元素的个数。
(2)获取数组长度的方法与获取字符串长度的方法相同,即首先利用
@
或*
将数组扩展成列表,然后使用#
来获取数组元素的个数,格式如下:# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
(3)实例演示
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash nums=(29 100 13) echo ${#nums[*]} #向数组中添加元素 nums[10]="http://c.biancheng.net/shell/" #一共有29个字符 echo ${#nums[@]} echo ${#nums[10]} #删除数组元素 unset nums[1] echo ${#nums[*]} xjh@ubuntu:~/iot/tmp$ ./test.sh 3 4 29 3 xjh@ubuntu:~/iot/tmp$
四、数组的拼接
(1)所谓 Shell 数组拼接(数组合并),就是将两个数组连接成一个数组。
(2)拼接数组的思路是:先利用
@
或*
,将数组扩展成列表,然后再合并到一起。具体格式如下:array_new=(${array1[@]} ${array2[@]}) array_new=(${array1[*]} ${array2[*]}
(3)实例演示
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash array1=(23 56) array2=(99 "http://c.biancheng.net/shell/") array_new=(${array1[@]} ${array2[*]}) echo ${array_new[@]} #也可以写作 ${array_new[*]} xjh@ubuntu:~/iot/tmp$ ./test.sh 23 56 99 http://c.biancheng.net/shell/ xjh@ubuntu:~/iot/tmp$
五、删除数组元素
(1)在 Shell 中,使用 unset 关键字来删除数组元素或者删除整个数组。如下所示,array_name 表示数组名,index 表示数组下标。
unset array_name[index] #删除数组中某个元素 unset array_name #删除整个数组
(2)实例演示
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash arr=(23 56 99 "http://c.biancheng.net/shell/") unset arr[1] echo ${arr[@]} unset arr echo ${arr[*]} xjh@ubuntu:~/iot/tmp$ ./test.sh 23 99 http://c.biancheng.net/shell/ #注意到这里有一个空行,是因为删除了整个数组,所以输出为空 xjh@ubuntu:~/iot/tm
六、关联数组
(1)现在最新的 Bash Shell 已经支持关联数组了。关联数组使用字符串作为下标,而不是整数,这样可以做到见名知意。
(2)关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。
(3)例如,我们可以创建一个叫做 color 的关联数组,并用颜色名字作为下标。注意,关联数组必须使用带有
-A
选项的 declare 命令创建。declare -A color color["red"]="#ff0000" color["green"]="#00ff00" color["blue"]="#0000ff" #或者在定义的同时赋值 declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff")
1、访问关联数组元素
访问关联数组元素的方式几乎与普通数组相同,具体形式为:
array_name["index"]
color["white"]="#ffffff" color["black"]="#000000"
加上
$()
即可获取数组元素的值:$(array_name["index"])
echo $(color["white"]) white=$(color["black"])
2、获取所有元素的下标和值
使用下面的形式可以获得关联数组的所有元素值:
${array_name[@]} ${array_name[*]}
使用下面的形式可以获取关联数组的所有下标值:
${!array_name[@]} ${!array_name[*]}
3、获取关联数组长度
${#array_name[*]} ${#array_name[@]}
4、实例演示
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash declare -A color color["red"]="#ff0000" color["green"]="#00ff00" color["blue"]="#0000ff" color["white"]="#ffffff" color["black"]="#000000" #获取所有元素值 for value in ${color[*]} do echo $value done echo "****************" #获取所有元素下标(键) for key in ${!color[*]} do echo $key done echo "****************" #列出所有键值对 for key in ${!color[@]} do echo "${key} -> ${color[$key]}" done xjh@ubuntu:~/iot/tmp$ ./test.sh #ff0000 #0000ff #ffffff #000000 #00ff00 **************** red blue white black green **************** red -> #ff0000 blue -> #0000ff white -> #ffffff black -> #000000 green -> #00ff00 xjh@ubuntu:~/iot/tmp$