文章目录
一数组
1.1数组的定义
- 数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
- 数组的类型
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A 声明否则系统不识别,索引可以是字符串
1.2数组的定方式
A="1 2 3 456" //定义字符串
A=(1 2 3 4 456) //定义数组(里面的每个数字又被称为元素)
0 1 2 3 4 //其下标示,0为起始(又称数组下标,索引下标)
第一种:
直接把要加入数组的元素用小括号括起来,中间用空格分开
数组名=(value0 value1 value2)
num=(11 22 33 44)
echo ${#num} ##显示单个字符串长度
2
[root@ky20-zy ~]# echo ${num[*]} ##显示详细字符串(数组)内容,#号换@也可以效果一样
11 22 33 44
[root@ky20-zy ~]# echo ${#num[*]} ##显示所有字符串(数组)长度,#号换@也可以效果一样
4
第二种:
精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
数组名=([0]=value [1]=value [2]value ...)
num=([0]=55 [1]=66 [2]77 [4]88)
[root@ky20-zy ~]# echo ${num[*]}
[0]55 [1]66 [2]77 [3]88
第三种:
先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
列表名="value0 value1 value2...."
数组名=($列表名)
list="11 12 13 14"
num=($list)
[root@ky20-zy ~]# echo ${num[*]}
11 12 13 14
[root@ky20-zy ~]# echo ${#num[*]}
4
第四种:
根据下标定义
数组名[0]="11"
数组名[0]="22"
数组名[0]="33"
数组名[0]="value"
数组名[0]="value"
数组名[0]="value"
1.3数组包括的数据类型
-
数值类型
-
字符类型:使用 " " 或 ’ ’ 定义
1.获取数组长度
num=(11 22 33 44)
[root@ky20-zy ~]# echo ${#num[*]} ##显示所有字符串(数组)长度,#号换@也可以效果一样
4
[root@ky20-zy ~]# echo ${#num[@]}
4
2.获取数据列表
num=(11 22 33 44)
[root@ky20-zy ~]# echo ${num[*]} ##显示详细字符串(数组)内容,#号换@也可以效果一样
11 22 33 44
[root@ky20-zy ~]# echo ${#num[@]}
11 22 33 44
3.数组元素遍历
#!/bin/bsah
arr=(1 2 3 4 5)
for i in ${arr[*]}
do
echo $i
done
[root@ky20-zy ~]# sh 4.sh
1
2
3
4
5
4.元素切片
[root@ky20-zy ~]# ky20-zy=(4 7 9 5 2) ##定义数组
[root@ky20-zy ~]# echo ${ky20-zy[*]} ##输出数组里的元素
4 7 9 5 2
0 1 2 3 4 ##索引下标
[root@ky20-zy ~]# echo ${ky20-zy[*]:2:3} ##提取从索引下标2开始的3个元素
9 5 2
[root@ky20-zy ~]# echo ${ky20-zy[*]:2:2} ##提取从索引下标2开始的2个元素
9 5
[root@ky20-zy ~]# echo ${ky20-zy[*]:3:2} ##提取从索引下标3开始的2个元素
5 2
[root@ky20-zy ~]# echo ${ky20-zy[*]:1:2} ##提取从索引下标1开始的2个元素
7 9
5.数组元素替换
[root@ky20-zy ~]# mqj=(36 35 34 33 32 31) ##定义数组
[root@ky20-zy ~]# echo ${mqj[*]} ##输出数组里的元素
36 35 34 33 32 31
[root@ky20-zy ~]# echo ${mqj[*]/3/55} ##将有3的元素替换或增加一个指定的数值55,只是覆盖,不是永久替换(仅替换每个元素的第一个匹配项)
556 555 554 553 552 551
6.数组删除
[root@ky20-zy ~]# jmq=(34 45 55 12)
[root@ky20-zy ~]# echo ${jmq[*]}
34 45 55 12
[root@ky20-zy ~]# unset jmq ##删除数组
[root@ky20-zy ~]# echo ${jmq[*]}
[root@ky20-zy ~]# jmq=(34 45 55 12)
[root@ky20-zy ~]# echo ${jmq[*]}
34 45 55 12
[root@ky20-zy ~]# unset jmq[3] ##删除第四元素,中括号里的是索引下标,删除后只是不显示元素而已,但会变为空格占用索引下标,如果查看长度的话会减少
[root@ky20-zy ~]# echo ${jmq[*]}
34 45 55
1.例:以数组的方式定义随机点名
[root@ky20-zy opt]# vim w ##创建编辑一个文件写入名字和对应编号
1大狮子
2小兔子
3小海豚
4花蝴蝶
5小家雀
[root@ky20-zy opt]# vim w.sh ##编写数组脚本
#!/bin/bash
bu=`cat /opt/w` ##定义变量
arr=($bu) ##定义数组变量
for i in ${arr[*]} ##循环查看里的内容数组
do
a=$[$RANDOM%5] ##定义变量取随机数
done
echo "小动物的编号和名字是: ${arr[$a]}" ##输出随机数对应的编号和名字
[root@ky20-zy opt]# sh w.sh
小动物的编号和名字是: 1大狮子
简单方法
#!/bin/bash
bu=`cat /opt/w`
arr=($bu)
a=$[$RANDOM%5]
echo "小动物的编号和名字是: ${arr[$a]}"
二、数组排序算法(冒泡排序)
类似气泡上涌的动作,将会数据在数组中从小到大或者从大到小不断断向前移动
- 基本思想
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部
- 算法思路
冒泡算法由两层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组就已经完成排序了
而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置对比和交换次数随排序轮数而减少
- 例:希望a和b的值对调位置
a=10
b=20
ky20-zy=$a
a=$b
b=$ky20-zy
a=20
b=10
冒泡算法由两层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组就已经完成排序了
而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置对比和交换次数随排序轮数而减少
- 例:希望a和b的值对调位置
a=10
b=20
ky20-zy=$a
a=$b
b=$ky20-zy
a=20
b=10