数组
1、数组概述
数组:多个元素组成的一个集合
主要作用:可以一次性定义多个变量,不需要人工依次声明
2、创建数组的格式
格式:
格式1:
数组名=(value0 value1 value2)
格式2:
数组名=([0]=1 [1]=2 [2]=3)
//[]是数组的下标索引,对应的是元素在数组当中的位置
3、打印数组的方式
echo ${数组名[*]} //打印整个数组所有元素
echo ${数组名[n]} //打印数组中索引下标为n的元素(数组中第一个元素的索引是0)
echo ${#数组名[*]} //打印数组的长度
4、遍历数组
示例1:数组中各元素为用户名的用户不存在,遍历此数组用其元素做用户名创建用户
[root@pup1 opt]# vim shuzu.sh
arr=(qqq www eee)
for user in ${arr[*]}
do
useradd $user
echo 123 | passwd --stdin $user
done
示例2:将数组中的数字拼接成一个完整的ip地址,判断可以通的保留到/opt/hosts.txt,不要过程,ping不通提示即可
[root@pup1 opt]# vim 1.sh
ip=(10 20 30 40)
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
5、数组切片
示例:
:0表示从索引下标为0的元素开始切片(包括此元素)
:2表示切片两个元素
6、对数组当中的元素替换
临时替换
示例:
表示将数组中第三个元素替换为6,刷新即失效
永久替换
示例:
7、删除数组及删除数组中的元素
删除整个数组
unset 数组名
删除数组中的指定元素(删除之后索引位置不会变动)
示例:
8、在数组中进行元素的追加
选择索引位置添加
示例:
不用索引位置在数组末尾添加
示例:(两种方式)
9、函数从数组中获取参数
示例1:
[root@pup1 opt]# vim 2.sh
fact () {
abc=($(echo $*))
echo "abc的数组值:${abc[*]}"
}
abc1=(`seq 0 2 10`) #定义数组abc1为从0-10的偶数
fact ${abc1[*]}
示例2:0-10的偶数累加求和
[root@pup1 opt]# vim 3.sh
fact () {
abc=($(echo $*))
sum=0
for num in ${abc[*]} #遍历abc数组进行累加求和
do sum=$[$sum+$num]
done
echo $sum
}
abc1=(`seq 0 2 10`)
fact ${abc1[*]}
示例3:将0-10的数组乘2并打印新数组
[root@pup1 opt]# vim 4.sh
fact () {
abc=($(echo $*))
echo "abc的数组值:${abc[*]}"
for ((num=0;num<=$(($#-1));num++)) #取的是索引下标的值
do
abc[$num]=$[${abc[$num]}*2]
done
echo ${abc[*]}
}
abc1=(`seq 1 10`)
fact ${abc1[*]}
10、冒泡排序
原理:在数组当中将两个相邻的元素进行比较
示例1:正向排序
[root@pup1 opt]# vim maopao.sh
#!/bin/bash
abc=(2 1 6 4 5 3)
length=${#abc[*]}
for ((i=1;i<$length;i++)) #确定循环的次数
do
for((j=0;j<$length-i;j++)) #定义内循环的范围,确定索引值,最后一位不用比较
do first=${abc[$j]} #定义第一个位置0起始位置元素的值
k=$[$j+1] #定义第二个索引下标,每次都比前一个加1
second=${abc[$k]} #定义数组当中第二个元素的值
if [ $first -gt $second ] #进行条件判断:正向排序
then temp=$first #定义一个临时交换变量,给第一个元素
abc[$j]=$second #$k的起始索引位置为1,原来索引下标1移动到索引下标0
abc[$k]=$temp
fi
done
done
echo ${abc[*]}
示例2:反向排序文件系统使用率
[root@pup1 opt]# vim fanxiang.sh
disk=(`df -h | awk 'NR>1 {print $5}' | tr -d '%'`)
length=${#disk[*]}
for ((i=1;i<$length;i++))
do
for((j=0;j<$length-i;j++))
do first=${disk[$j]}
k=$[$j+1]
second=${disk[$k]}
if [ $first -lt $second ]
then temp=$first
disk[$j]=$second
disk[$k]=$temp
fi
done
done
echo ${disk[*]}