目录
一、理论
1.数组概述
2.定义数组
3.数组打印
4.数组的数据类型及处理
5.数组赋值
6.数组遍历
7.数组切片
8.数组替换
9.删除数组
10.追加数组中的元素
11.数组排序算法
二、实验
1.实验一
2.实验二
3.实验三
一、理论
1.数组概述
数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。
当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。
2.定义数组
(1)索引数组
① 方式一
数组名=(
value0
valuel
value2
…
)
② 方式二 shell中,用小括号( )来表示数组,数组元素之间用空格来分隔
数组名=(value0 valuel value2 …)
③ 方式三 采用键值对的形式赋值
数组名=( [0]=value [1]=value [2]=value …)
④ 方式四 通过分别定义数组变量的方法来定义
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
⑤ 方式五
列表名=“value0 valuel value2 …”
数组名=($列表名)
(2)备注
① 数组中的元素,必须以"空格"来隔开,这是其基本要求;
② 定义数组其索引,可以不按顺序来定义,比如说:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy);
③ 字符串是SHELL中最重要的数据类型,其也可通过($str)来转成数组,操作起来非常方便;
3.数组打印
(1)打印单个数组元素
${数组名[下标]} 。当未指定数组下标时,下标默认从0开始
(2)打印全部数组内容
${数组名[@]}或 ${数组名[*]}
(3)打印数组元素的个数
${#数组名[@]}或 ${#数组名[*]}
4.数组的数据类型及处理
(1) 使用" "或‘ ’定义:
① 数值类型
② 字符类型
(2)处理数组
① 直接获取元素的值及数组的信息
获取单个元素的值
echo ${array[0]} #获取第一个元素的值
echo ${array[-1]} #获取最后一个元素的值
获取所有元素的值
echo ${array[*]}
echo ${array[@]}
统计数组的长度
echo ${#array[*]}
5.数组赋值
如果下标不存在,则自动添加一个新的元素;如果下标存在,则覆盖原来的值
6.数组遍历
(1)标准的for循环
(2)for … in循环方法
(3)While循环法
7.数组切片
取数组中的某一段的元素的值
格式:
${数组名[@或*]}:起始位置(起始索引):长度
8.数组替换
格式:
$(数组名[@或*]/查找字符/替换字符}
(1)临时替换
(2)永久替换
(3)匹配替换
${array[@]/x/y} 最小匹配替换,每个元素只替换一次
${array[@]//x/y} 最大匹配替换,每个元素可替换多次
${array[@]/x/} 最小匹配删除,只删除一个符合规定的元素
${array[@]//x/} 最大匹配删除,可删除多个符合规定的元素
${array[@]/#x/y} 从左往右匹配替换,只替换每个元素最左边的字符
${array[@]/%x/y} 从右往左匹配替换,只替换每个元素最右边的字符
9.删除数组
(1)使用unset删除数组
(2)匹配删除
# 每个元素,从左向右进行最短匹配
## 每个元素,从左向右进行最长匹配
% 每个元素,从右向左进行最短匹配
%% 每个元素,从右向左进行最长匹配
10.追加数组中的元素
(1)+=,待添加元素必须用“()"包围起来,并且多个元素用空格分隔
(2)当数组的元素非常多的时候,可以直接使用数组的长度作为自己将要追加的索引的值,这样就可以直接追加元素了。
因为原始数组的索引是从0开始的,所以用长度减去1就是原始数组的最后的以为索引值了,
那么自己将要添加的值应该是原始索引值的后一位,那显然就等于数组的长度值了。
(3)双引号不能省略,否则,当数组array中存在包含空格的元素时会按空格将元素拆分成多个。
不能将“@“替换为“*”,如果替换为"*",
不加双引号时与"@"的表现一致,加双引号时,会将数组array中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。
$*、$@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。
11.数组排序算法
(1)冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
① 基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,
如果满足条件就交换元素值,把较小的元素移动到数组前面,
把大的元素移动到数组后面(也就是交换两个元素的位置) ,
这样较小的元素就像气泡一样从底部上升到顶部
② 算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,
一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,
同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,
以确定是否交换位置,对比和交换次数随排序轮数而减少。
在实际应用中,冒泡排序适用于对小规模数据进行排序.
③ 假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:
1) 第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如下图所示。
2) 第二轮排序,此时待排序序列只包含前 4 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如下图所示。
3) 第三轮排序,此时待排序序列包含前 3 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如下图所示。
4) 第四轮排序,此时待排序序列包含前 2 个元素,对其进行冒泡排序的整个过程如下图所示。
5) 当进行第五轮冒泡排序时,由于待排序序列中仅剩 1 个元素,无论再进行相邻元素的比较,因此直接将其并入已排序序列中,此时的序列就认定为已排序好的序列。
二、实验
1.实验一
冒泡排序(升序)
(1)脚本截图
(2)运行结果
2.实验二
df -h命令查询磁盘空间使用率,去百分号并降序排序
(1)脚本截图
(2)运行结果
3.实验三
获取索引下标,实现数组每个值乘2
(1)脚本截图
(2)运行结果