一、 Shell数组的概念
数组是若干数据的集合,其中存放的每一份数据都称为元素。Shell
不限制数组的大小,理论上可以存放无限量的数据,Shell
数组元素的下标也是从0开始计数
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;下标必须大于等于0
注意:
Shell
只支持一维数组,不支持多维数组
二、shell 数组的定义
1.1、数组的基本定义
在Shell
中,用小括号()
来表示数组,数组元素之间用空格来分隔
#arrayname=(1 2 3 4 5)
`输出定义数组中的全部元素
#echo ${arrayname[*]}
#echo ${arrayname[@]}
`输出定义数组中的第二个元素
#echo ${arrayname[0]}
`输出定义数组中的第二个元素
#echo ${arrayname[1]}
`输出定义数组中的元素个数
#echo ${#arrayname[*]}
1.2 、采用键值对的形式赋值
在Shell
中用小括号将变量括起来,同时采用键值对的形式赋值
#array2=([1]=one [2]=two [3]=three)
echo ${array2[*]} #输出定义数组的所有元素
echo ${array2[@]} #输出定义数组的所有元素
echo ${#array2[@]} #输出定义数组的元素个数
1.3、 通过分别定义数组变量的方法来定义
#array3[1]=a
#array3[2]=b
#array3[3]=c
`输出定义数组中的全部元素
echo ${array3[@]}
`输出定义数组中的第一个元素
echo ${array3[1]}
1.4、 动态定义数组数量
动态地定义数组变量,并使用命令的输出结果作为数组的内容
# mkdir -p /array
# touch /array/{1..5}.txt
# ls /array
# array4=($(ls /array))
# echo ${array4[*]}
# echo ${array4[@]}
# echo ${#array4[*]}
2、Shell数组的打印
-
打印单个数组元素: ${数组名[下标]} 。当未指定数组下标时,下标默认从0开始
-
打印全部数组内容:${数组名[@]}或 ${数组名[*]}
-
打印数组元素的个数:${#数组名[@]}或 ${#数组名[*]}
3、 Shell数组的赋值
如果下标不存在,则自动添加一个新的元素;如果下标存在,则覆盖原来的值
4、 Shell数组的拼接合并
所谓Shell
数组拼接(数组合并),就是将两个数组连接成一个数组
拼接数组的思路是:先利用@
或者*
,将数组扩展成列表,然后再合并到一起,具体格式如下:
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
`两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。
示例:
#!/bin/bash
array1=(1 2 3 4 5)
array2=("https://www.baidu.com" "https://www.hehao.online" "https://www.taobao.com")
array_new=(${array1[*]} ${array2[*]})
echo ${array_new[@]}
--->结果
1 2 3 4 5 https://www.baidu.com https://www.hehao.online https://www.taobao.com
5、 Shell删除数组元素
在Shell
中,使用unset关键字来删除数组元素,具体格式如下:
unset array_name[index]
`其中,array_name表示数组名,index表示数组下标
unset array_name
`删除整个数组
6、 获取数组某范围的元素
在Shell
中直接通过${数组名[@/*]:起始位置:长度}
获取数组给定范围内元素,返回字符串,中间用空格分开
#!/bin/bash
array=(yoona lucy tom)
echo ${array[*]}
echo ${array[*]:1:2}
echo ${array[@]:0:2}
-->结果为:
yoona lucy tom
lucy tom
yoona lucy
7、 数组元素的替换
${数组名[@/*]/查找字符/替换字符}
该操作不会改变原先数组内容,如果需要修改,使用覆盖
#!/bin/bash
array=(yoona lucy tom)
echo ${array[@]/lucy/lily}
echo ${array[*]}
--->结果为:
yoona lily tom
yoona lucy tom
8、 关联数组
Bash支持关联数组,它可以使用字符串作为数组索引,有时候采用字符串索引更容易理解
8.1、 定义关联数组
首先需要使用声明语句declare
将一个变量声明为关联数组
# declare -A assArray
声明后,可以有两种方法将添加到关联数组中
1.利用内嵌索引-值列表的方法
# assArray=([lucy]=beijing [yoona]=shanghai)
# echo ${assArray[lucy]}
--->结果为:
beijing
2.使用独立的索引-值进行赋值
# assArray[lily]=shandong
# assArray[sunny]=xian
# echo ${assArray[sunny]}
-->结果为:xian
8.2 、列出数组索引
每一个数组都有一个索引用于查找。使用${!数组名[@/*]}
获取数组的索引列表
# echo ${!assArray[*]}
# echo ${!assArray[@]}
8.3、获取所有键值对
#! /bin/bash
declare -A cityArray
cityArray=([yoona]=beijing [lucy]=shanghai [lily]=shandong)
for key in ${!cityArray[*]}
do
echo "${key} come from ${cityArray[$key]}"
done
--->结果为:
lily come from shandong
yoona come from beijing
lucy come from shanghai
9 、mapfile命令
9.1、 mapfile命令介绍
mapfile
命令用于从标准输入读取行并赋值到数组
9.2、 mapfile语法结构
mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
选项介绍
`-d delim :将delim设为行分隔符,代替默认的换行符
`-n count :从标准输入中获取最多的count行,如果count为0那么获取全部
`-O origin:从数组下标为origin的位置开始赋值,默认的下标为0
`-s count: 跳过对前count行的读取
`-t : 读取时移除分隔符delim(默认为换行符)
`-u fd:从文件描述符fd中读取
`-C callback:每当读取了quantum行时,调用callback语句
`-c quantum:设定读取的行数为quantum
`array(可选):用于输出的数组名称。如果没有指定数组名称,那么会默认写入到变量名为MAPFILE的数组中
# 如果使用-C时没有同时使用-c指定quantum的值,那么quantum默认为5000。
#当callback语句执行时,将数组下一个要赋值的下标以及读取的行作为额外的参数传递给callback语句。
#如果使用-O时没有提供起始位置,那么mapfile会在实际赋值之前清空该数组
9.3 、使用示例
`dns_list.txt
www.baidu.com
www.taobao.com
www.douyin.com
www.4399.com
[root@localhost Shell_Study]# mapfile array < dns_list.txt
[root@localhost Shell_Study]# echo ${#array[*]}
4
[root@localhost Shell_Study]# echo ${array[#]}
[root@localhost Shell_Study]# echo ${array[@]}
www.baidu.com www.taobao.com www.douyin.com www.4399.com