对数组的增删改查
冒泡排序
数组:是由多个元素组成的一个集合
int string 浮点
数组的主要作用就是可以一次性的定义多个变量,不需要我们人工依次声明
a=1
b=2
直接在数组里面定义好变量
定义数组(数组的创建方式)
第一种方式
数组名=(value0 value2)
多个元素之间用空格来隔开
[root@localhost opt]# test=(1 2 3 4 ) 创建方式
[root@localhost opt]# echo ${test[*]} 打开方式
1 2 3 4
数组的下标索引,对应的是元素在数组当中的位置
[root@localhost opt]# test2=([0]=3 [1]=2 [2]=4)
[root@localhost opt]# echo ${test2[*]}
3 2 4
------------------------
[root@localhost opt]# echo ${test1[*]} 0对应的是第一个 1是对应的第二个 以此类推
a b c d e f g
[root@localhost opt]# echo ${test1[0]}
a
[root@localhost opt]# echo ${test1[3]}
d
实验例子
ip=(10 20 40 50)
read -p "输入网络部分:" net
for i in ${ip[*]}
do
ping -c 3 ${net}${i} &> /dev/null
if [ $? -eq 0 ]
then
echo "通"
echo ${net}${i}>> /opt/hosts.txt
else
echo "不通"
fi
done
数组的切片
[root@localhost opt]# arr1=(1 2 3 4 5 6 7 )
[root@localhost opt]# echo ${arr1[*]}
1 2 3 4 5 6 7
[root@localhost opt]# echo ${arr1[*]:0:2} --这里的0:2意思是从0开始的初始位到后面的2位
1 2
数组内的值重新替换
[root@localhost opt]# arr2=(1 2 3 4 )
[root@localhost opt]# arr2=(${arr2[*]/3/66})
[root@localhost opt]# echo ${arr2[*]}
1 2 66 4
删除数组
[root@localhost opt]# echo ${arr2[*]}
1 2 66 4
[root@localhost opt]# unset arr2
[root@localhost opt]# echo ${arr2[*]}
-------------------------
根据下标索引删除数组内指定元素
[root@localhost opt]# unset arr1[3]
[root@localhost opt]# echo ${arr1[*]}
当元素被删除时 元素为空,索引为空 不往后递增 数组内其他元素不会发生变化
1 2 3 5 6
在数组当中追加元素
[root@localhost opt]# arr1[3]=8
[root@localhost opt]# echo ${arr1[*]}
1 2 3 8 5 6
------------
[root@localhost opt]# echo ${arr1[*]}
1 2 3 8 5 6 test
------------
[root@localhost opt]# arr1+=(11 12 13)
[root@localhost opt]# echo ${arr1[*]}
1(11) 2 3 8 5 6 test 10 11 12 13
数组的具体应用
czy () {
abc=($(echo $@))
echo "abc的数组值:${abc[*]}}"
sum=0
for num in ${abc[*]}
do
sum=$(($sum+$num))
done
echo $sum
}
abc1=(`seq 0 2 10`)
czy ${abc1[*]}
冒泡排序
类似气泡上涌的动作,在数组当中的元素从小到大,从大到小不断的移动
正向:
1 2 3 4 5 6 7 8 9 10
反向:
10 9 8 7 6 5 4 3 2 1
冒泡排序的一个思路 :
不管是正向反向也罢
在数组当中两个数字相邻的元素进行比较,正向为例:
(10 3 6 2 20)
两个相邻的值进行比较
0 1 2 3 4
10 3 进行比较
3 10 6 2 20
3 6 10 2 20
3 6 2 10 20
2 3 6 10 20
for循环:双层循环
外循环控制循环的次数
内循环来比较相邻数值完成位置交换
内外循环的不同作用
abc=(20 10 60 40 50 30)
正向
for 循环5次就可以满足条件了
#!/bin/bash
#定义数组
abc=(20 10 60 40 50 30)
length=${#abc[*]}
for ((i=1;i<$length;i++))
#确定循环的次数
do
echo
for ((k=0;k<$length-i;k++))
#定义内循环的范围,确定索引值,最后一位不用再去比较 0 1 2 3 4
do
first=${abc[$k]}
#定义了第一个位置0起始位置元素的值
j=$(($k+1))
#定义第二个索引下标,每次都比前一个+1
second=${abc[$j]}
#定义数组当中第二个元素的值
if [ $first -gt $second ]
#进行条件判断:正向排序,大的要往后移,小的要往前移。第一个数的值大于第二个数
then
temp=$first
#定义一个临时交换变量,给第一个元素
abc[$k]=$second
#$k的起始值是0,原来的索引下标是1的值移动到索引下标0的位置 abc[0]=10
abc[$j]=$temp
#大的值往后移 abc[1]=20
fi
done
done
echo "新的正向排序的数组为:${abc[*]}"
------------------
[root@localhost opt]# sh z.sh
新的正向排序的数组为:10 20 30 40 50 60
df -h | awk ‘NR>1 {print $5}’ |tr -d ‘%’