1 什么是数组
数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
用于区分数组的各个元素的数字编号称为下标。元素的下标从0开始。
数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。
2 定义数组的方法
Shell中,数组用括号来表示,元素用"空格"符号分隔开。
数组包括的数据类型:
- 数值型
- 字符型 (如果元素值为字符类型,需要加单引号或双引号,防止单个元素中有空格被当成2个元素)
- 混合型数值加字符
方法一:
数组名=(value1 value2 value3 value4 ...) 复制代码
方法二:
先定义列表,再引用列表的值定义数组。
列表名="value1 value2 value3 value4 value5" 数组名=($列表名) 复制代码
方法三:
用过下标值定义每个元素。
数组名=([0]=value1 [1]=value2 [2]=value3) 复制代码
方法四:
通过下标值,一个一个定义数组内的每个元素。
同时也可以通过这种方式修改元素的值。
数组名[0]=value1 数组名[1]=value2 数组名[2]=value3 数组名[3]=value4 复制代码
网络异常,图片无法展示
|
3 引用数组的值
1、获取数组的数据列表(所有元素的值)
echo ${array[@]} 或 echo ${array[*]} 复制代码
网络异常,图片无法展示
|
2、查看数组内某一个元素的值
${数组名[n]} //n代表元素的下标 echo ${array[0]} //获取数组内第一个元素的值(下标为0的元素值) echo ${array[1]} //获取数组内第二个元素的值(下标为1的元素值) 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
3、获取数组的长度
echo ${#数组名[*]} echo ${#数组名[@]} 复制代码
网络异常,图片无法展示
|
4、查看数组内最后一个元素的值
方法一:
echo ${array[-1]} //获取最后一个元素的值 echo ${array[-2]} //获取倒数第二个元素的值 复制代码
网络异常,图片无法展示
|
方法二:
length=${#array[@]} //获取数组的长度 last=$[$length-1] //数组的长度减1 echo ${array[$last]} //查看最后一个元素值 #用这种方式查看最后一个元素值,可以判断这个数组的下标是不是完整的。因为如果中间跳过了一个下标,那么此种方法无法获取最后一个元素的值。 echo ${array[${#array[@]}]} //查看下标值为数组长度的元素,如果没有跳过某个下标值,那么这个应该为空。如果不为空,说明跳过了某个下标值,数组下标不完整。 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
4 数组的常用操作
4.1 数组分片(数组截取)
格式:
${数组名[@]:起始位置:截取长度} //起始位置从0算起 ${数组名[@]} //获取整个数组的元素值 ${数组名[@]:0:3} //从下标为0的元素开始截取,共截取3个元素。(即截取元素1到元素3) ${数组名[@]:2:2} //从下标为2的元素开始截取,共截取2个元素。(即截取元素3到元素4) 复制代码
示例:
[root@yuji ~]# arr1=(10 20 30 40 50 60) [root@yuji ~]# echo ${arr1[@]} 10 20 30 40 50 60 [root@yuji ~]# echo ${arr1[@]:0:3} //从下标为0的元素开始截取,共截取3个元素 10 20 30 [root@yuji ~]# echo ${arr1[@]:2:2} //从下标为2的元素开始截取,共截取2个元素 30 40 [root@yuji ~]# echo ${arr1[@]:2:4} //从下标为2的元素开始截取,共截取4个元素 30 40 50 60 复制代码
网络异常,图片无法展示
|
4.2 数组元素替换
1、临时替换(不会影响原有数组)
echo ${数组名[@]/旧字符/新字符} //会替换所有元素中能匹配到的字符,但这是临时替换,不会改变原有数组的值 复制代码
示例1:将30替换为100
[root@yuji ~]# arr2=(10 20 30 40) //定义数组 [root@yuji ~]# echo ${arr2[@]} //查看数组内的所有元素 10 20 30 40 [root@yuji ~]# echo ${arr2[@]/30/100} //将30临时替换为100 10 20 60 40 [root@yuji ~]# echo ${arr2[@]} //不会改变原有数组内的元素值 10 20 30 40 复制代码
网络异常,图片无法展示
|
示例2:将所有的0替换为7
[root@yuji ~]# echo ${arr2[@]} 10 20 30 40 [root@yuji ~]# echo ${arr2[@]/0/7} //将所有的0替换为7 17 27 37 47 [root@yuji ~]# echo ${arr2[@]} //不会改变原有数组的元素值 10 20 30 40 复制代码
网络异常,图片无法展示
|
2、重新赋值(永久替换)
数组名=(${数组名[@]/旧字符/新字符}) 复制代码
示例:将30重新赋值为200
[root@yuji ~]# echo ${arr2[@]} 10 20 30 40 [root@yuji ~]# arr2=(${arr2[@]/30/200}) //重新赋值 [root@yuji ~]# echo ${arr2[@]} //会改变原有数组的元素值 10 20 200 40 复制代码
网络异常,图片无法展示
|
4.3 删除数组
1、删除数组内的某个元素
unset 数组名[n] //删除数组内的某一个元素,n为下标值 复制代码
示例:
[root@yuji ~]# echo ${aa[@]} 10 20 30 40 [root@yuji ~]# unset aa[2] //删除下标值为2的元素 [root@yuji ~]# echo ${aa[@]} //30已被删除 10 20 40 复制代码
网络异常,图片无法展示
|
2、删除整个数组
unset 数组名[*] 或 unset 数组名[@] 复制代码
示例:
[root@yuji ~]# echo ${aa[@]} 10 20 40 [root@yuji ~]# unset aa[@] //删除整个数组 [root@yuji ~]# echo ${aa[@]} //查看数组所有元素值,已为空 [root@yuji ~]# echo ${bb[*]} 1 2 3 4 [root@yuji ~]# unset bb[*] //删除整个数组 [root@yuji ~]# echo ${bb[*]} //查看数组所有元素值,已为空 [root@yuji ~]# 复制代码
网络异常,图片无法展示
|
4.4 数组扩写,增加数组内的元素
当我们原本定义的数组不能满足我们的需求时,我们需要追加数组内的元素。
#方法1 数组名[n]=元素值 //使用下标值直接增加元素 #方法2 数组名+=(元素1 元素2 .....) #方法3 数组名[数组长度]=元素值 //此种方法必须保证数组元素是完整的,如果某个下标被跳过了,此种方法会替换掉原来的某个元素 #方法4 数组名=("${数组名[@]}" 元素1 元素2 .....) //引用数组值必须加双引号,不然原数组内有空格的单个元素(例如"zhang san")会被当成2个元素。 //且必须使用@,因为加上双引号之后"$@"表示将所有参数当作个体,而$*表示将所有参数当作一个整体。 复制代码
方法1示例:数组名[n]=元素值
[root@yuji ~]# echo ${cc[@]} 10 20 30 [root@yuji ~]# cc[3]=40 [root@yuji ~]# cc[4]=50 [root@yuji ~]# echo ${cc[@]} 10 20 30 40 50 复制代码
网络异常,图片无法展示
|
方法2示例:数组名+=(元素值)
[root@localhost ~]# echo ${a[@]} 1 2 3 4 5 [root@localhost ~]# a+=(6) //增加元素值6 [root@localhost ~]# echo ${a[@]} 1 2 3 4 5 6 [root@localhost ~]# a+=(7 8 9) //增加元素值7、8、9 [root@localhost ~]# echo ${a[@]} 1 2 3 4 5 6 7 8 9 复制代码
网络异常,图片无法展示
|