Shell数组详解
一、Shell数组
Shell 也支持数组。数组(Array)是若干数据的集合。
1、定义
定义数组的一般形式为:
array_name=(ele1 ele2 ele3 ... elen)
- 用括号
( )
来表示数组,数组元素之间用空格来分隔 - 赋值号
=
两边不能有空格,必须紧挨着数组名和数组元素。
2、特征
- 1、Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。
- 2、Shell 数组元素的下标也是从 0 开始计数。
- 3、Shell获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
- 4、Bash Shell 只支持一维数组,不支持多维数组。
- 5、Shell 是弱类型的,它并
不要求所有数组元素的类型必须相同
。
3、使用
3.1、定义数组实例
nums=(29 100 13 8 91 44)
arr=(20 56 "helloworld")
Shell 数组的长度不是固定
的,定义之后还可以增加元素。例如,对于上面的 nums 数组,它的长度是 6,使用下面的代码会在最后增加一个元素,使其长度扩展到 7:
nums[6]=88
无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:
ages=([3]=24 [5]=19 [10]=12)
只给第 3、5、10 个元素赋值,所以数组长度是 3。
3.2、获取数组元素
${array_name[index]}
array_name
是数组名,index
是下标。
n=${nums[2]}
表示获取 nums
数组的第二个元素,然后赋值给变量 n
。
echo ${nums[3]}
输出 nums
数组的第 3 个元素。
${nums[*]}
${nums[@]}
使用@
或*
可以获取数组中的所有元素
#!/bin/bash
nums=(29 100 13 8 91 44)
echo ${nums[@]} #输出所有数组元素
nums[10]=66 #给第10个元素赋值(此时会增加数组长度)
echo ${nums[*]} #输出所有数组元素
echo ${nums[4]} #输出第4个元素
3.3、数组长度
数组长度,就是数组元素的个数。使用#
来获取数组元素的个数
${#array_name[@]}
${#array_name[*]}
如果某个元素是字符串,还可以通过指定下标的方式获得该元素的长度
${#arr[2]}
获取 arr 数组的第 2 个元素(假设它是字符串)的长度。
或者
${#string_name} #string_name 是字符串名。
实例
#!/bin/bash
nums=(29 100 13)
echo ${#nums[*]}
#向数组中添加元素
nums[10]="helloworld"
echo ${#nums[@]}
echo ${#nums[10]}
#删除数组元素
unset nums[1]
echo ${#nums[*]}
echo ${nums[*]}
3.4、数组拼接
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
利用@
或*
,将数组扩展成列表,然后再合并到一起。
两种方式是等价的,选择其一即可。其中,array1
和 array2
是需要拼接的数组,array_new
是拼接后形成的新数组。
#!/bin/bash
array1=(23 56)
array2=(99 "hello,KOBE")
array_new=(${array1[@]} ${array2[*]})
echo ${array_new[@]} #也可以写作 ${array_new[*]}
3.5、数组删除
unset array_name[index]
unset
关键字来删除数组元素,array_name
表示数组名,index
表示数组下标。
#!/bin/bash
array1=(8 "hi,GiGi")
array2=(24 "hello,KOBE")
array_new=(${array1[@]} ${array2[*]})
echo ${array_new[*]}
unset array_new[0]
echo ${array_new[*]}
二、Shell关联数组
关联数组使用字符串作为下标,而不是整数,可以使用任意的文本作为数组索引。
1、定义
关联数组也称为“键值对(key-value)
”数组,键(key)
也即字符串形式的数组下标,值(value)
也即元素值。
declare -A arr_name
关联数组必须使用带有-A
选项的 declare
命令创建,arr_name
为数组名
2、使用
2.1、定义数组实例
1、使用行内“索引-值”进行赋值
arr_name=([index1]=val1 [index2]=val2)
实例
declare -A Allstar=(["KOBE"]="24", ["GIGI"]="2", ["Lebron"]="23")
2、使用独立的”索引-值“进行赋值
arr_name[index1]=val1
arr_name[index2]=val2
实例
declare -A Allstar
Allstar["KOBE"]="24"
Allstar["GIGI"]="2"
Allstar["Lebron"]="23"
2.2、获取数组元素以及所有元素的下标和值
array_name["index"]
加上$()
即可获取数组元素的值:
$(array_name["index"])
declare -A Allstar
Allstar["KOBE"]="24"
echo $(Allstar["KOBE"])
获取所有元素的下标和值
使用下面的形式可以获得关联数组的所有元素值:
${array_name[@]}
${array_name[*]}
使用下面的形式可以获取关联数组的所有下标值
${!array_name[@]}
${!array_name[*]}
2.3、数组长度
${#array_name[*]}
${#array_name[@]}
2.4、关联数组实例
#!/bin/bash
declare -A Allstar
Allstar["KOBE"]="24"
Allstar["GIGI"]="2"
Allstar["Lebron"]="23"
#获取所有元素值
for value in ${Allstar[*]}
do
echo $value
done
echo "****************"
#获取所有元素下标(键)
for key in ${!Allstar[*]}
do
echo $key
done
echo "****************"
#列出所有键值对
for key in ${!Allstar[@]}
do
echo "${key} -> ${Allstar[$key]}"
done
输出结果如下:
2
23
24
****************
GIGI
Lebron
KOBE
****************
GIGI -> 2
Lebron -> 23
KOBE -> 24
参考
1、http://c.biancheng.net/view/810.html
2、http://c.biancheng.net/view/3009.html