概念
arr=(30 20 10 60) #数组中的元素值
其中定义
30为索引0
20为索引1
10为索引2
60为索引3
以此类推,不过注意索引是从0开始的,不要弄混肴了。
如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3” (作为一个整体使用)
"$@" 为“1” “2” “3” (分别作为单个的个体使用)
"$#" 为3 (表示参数的数量,也可以叫做长度)
arr=("a" "b" "c")
echo "使用 \"${arr[*]}\" 进行展开:"
for item in "${arr[*]}"; do
echo $item
done
echo "使用 \"${arr[@]}\" 进行展开:"
for item in ${arr[@]}; do
echo $item
done
数组定义方法
方法一:
数组名=(value0 valuel value2 …)
举例:
[root@loaclhost shuzu1]#arr=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr[*]}
1 2 3 4 5
方法二:
数组名=( [0]=value [1]=value [2]=value …)
举例:
[root@loaclhost shuzu1]#arr=([0]=1 [1]=2 [2]=3)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3
方法三:
列表名=“value0 valuel value2 …”
数组名=($列表名)
举例:
[root@loaclhost shuzu1]#list="1 2 3 4"
[root@loaclhost shuzu1]#arr2=($list)
[root@loaclhost shuzu1]#echo ${arr2[*]}
1 2 3 4
方法四:
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
举例:
root@loaclhost shuzu1]#arr3[0]="1"
[root@loaclhost shuzu1]#arr3[1]="2"
[root@loaclhost shuzu1]#arr3[2]="3"
[root@loaclhost shuzu1]#echo ${arr3[*]}
1 2 3
数组包括的数据类型
- 数值类型
- 字符类型
- 使用" "或‘ ’定义
获取数组长度
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${#arr1[*]} #也就是数组中总共多少个元素
5
读取某下标赋值
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[0]} #获取索引为0的元素,即第一个元素
1
[root@loaclhost shuzu1]#echo ${arr1[3]} #获取索引为3的元素,即第四个元素
4
数组遍历
[root@loaclhost shuzu1]#vim a.sh
#!/bin/bash
arr5=(1 2 3 4 5)
for i in ${arr5[*]} 或 for i in ${arr5[@]} #使用*或者@表示都可以
do
echo $i
done
[root@loaclhost shuzu1]#chmod +x a.sh
[root@loaclhost shuzu1]#./a.sh #将数组中的元素列出来就叫数组遍历
1
2
3
4
5
数组切片
取数组中的某一段的元素的值
格式:
${数组名[@或*]}:起始位置(起始索引):长度
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[*]} #输出整个数组
1 2 3 4 5
[root@loaclhost shuzu1]#
[root@loaclhost shuzu1]#echo ${arr1[*]:0:2} #这里是从0索引开始获得往后两位元素的值
1 2
[root@loaclhost shuzu1]#echo ${arr1[*]:2:2} #获取从索引2开始往后的两位元素的值
3 4
数组替换
临时替换或者永久替换
格式:
$(数组名[@或*]/查找字符/替换字符}
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[*]/4/66} #将数组arr1中的元素4替换为66,这只是临时替换,并不是永久替换
1 2 3 66 5
[root@loaclhost shuzu1]#echo ${arr1[*]} #原来的数组中的元素的值并不会改变
1 2 3 4 5
[root@loaclhost shuzu1]#arr1=(${arr1[*]/4/66}) #如果想要永久替换的话,可通过重新赋值实现
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 66 5
[root@test1 opt]# arr1[3]=44
[root@test1 opt]# echo ${arr1[*]}
1 2 3 44 5 6
删除数组
使用unset删除数组
[root@loaclhost shuzu1]#unset arr1
[root@loaclhost shuzu1]#echo ${arr1[*]}
删除数组中的某个索引对应的元素的值
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost shuzu1]#unset arr1[2] #删除索引2的对应的元素值
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 4 5
追加数组中的元素
当想要在数组中原有的元素后面再追加一些元素的话,可以使用如下方法实现追加
方法一:
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5 #这是原始的数组中的各元素的值,一直到索引4结束
[root@loaclhost shuzu1]#arr1[5]=6 #此时追加数组索引5对应的元素值为6
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5 6 #发现数组的索引5位置上的元素已经追加成功
方法二:
[root@loaclhost shuzu1]#arr1[${#arr1[*]}]=7
#当数组的元素非常多的时候,可以直接使用数组的长度作为自己将要追加的索引的值,这样就可以直接追加元素了。
因为原始数组的索引是从0开始的,所以用长度减去1就是原始数组的最后的以为索引值了,
那么自己将要添加的值应该是原始索引值的后一位,那显然就等于数组的长度值了。
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5 6 7
方法三:
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost shuzu1]#arr1=("${arr1[@]}" 6 7)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5 6 7
双引号不能省略,否则,当数组arr1中存在包含空格的元素时会按空格将元素拆分成多个。
不能将“@“替换为“*”,如果替换为"*",
不加双引号时与"@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。
$*、$@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。
[root@loaclhost shuzu1]#abc=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${abc[*]}
1 2 3 4 5
[root@loaclhost shuzu1]#abc=(${abc[@]} 6 7 8) #用@可以不加引号
[root@loaclhost shuzu1]#echo ${abc[*]}
1 2 3 4 5 6 7 8
[root@loaclhost shuzu1]#for i in ${abc[*]}
> do
> echo $i
> done
> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
--------------------------------------------------------------------------------
[root@loaclhost shuzu1]#abc1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${abc1[*]}
1 2 3 4 5
[root@loaclhost shuzu1]#abc1=("${abc1[*]}" 6 7 8)
[root@loaclhost shuzu1]#echo ${abc1[*]}
1 2 3 4 5 6 7 8
[root@loaclhost shuzu1]#for i in "${abc1[@]}";do echo $i;done
1 2 3 4 5
方法四:
[root@loaclhost shuzu1]#arr1=(1 2 3 4 5)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost shuzu1]#arr1+=(11 22)
[root@loaclhost shuzu1]#echo ${arr1[*]}
1 2 3 4 5 11 22
待添加元素必须用“()"包围起来,并且多个元素用空格分隔
向函数传数组参数
1、如果将数组变量作为函数参数,函数只会取数组变量的第一个值。如下:
[root@loaclhost shuzu1]#vim b.sh
#!/bin/bash
test1 () {
echo "接受到的参数列表:$@"
abc2=$1
echo "新数组的值为:${abc2[*]}"
}
abc=(3 2 1 4 5)
echo "原始数组的值为:${abc[*]}"
test1 $abc #将数组变量作为函数的参数,只会取数组变量的第一个值
[root@loaclhost shuzu1]#chmod +x b.sh
[root@loaclhost shuzu1]#./b.sh
原始数组的值为:3 2 1 4 5
接受到的参数列表:3
新数组的值为:3
2、解决这个问题则需要将数组变量的值分解成单个的值,
然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。如下:
$*、$@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。
[root@loaclhost shuzu1]#vim c.sh
#!/bin/bash
test2 () {
abc1=($(echo $@)) 或者表示为 abc1=(`echo $@`)
echo "新数组的值为:${abc1[*]}"
}
abc=(`seq 1 10`)
test2 ${abc[*]} #将数组的值分解为单个的值
[root@loaclhost shuzu1]#chmod +x c.sh
[root@loaclhost shuzu1]#./c.sh
新数组的值为:1 2 3 4 5 6 7 8 9 10
3、从函数返回数组(调用新数组的元素进行函数运算)
实例—加法传参运算
[root@loaclhost shuzu1]#vim c.sh
#!/bin/bash
test2 () {
abc1=(`echo $@`)
sum=0
for i in ${abc1[*]}
do
sum=$[$sum + $i]
done
echo "$sum"
}
abc=(3 2 1 4 5)
test2 ${abc[*]}
[root@loaclhost shuzu1]#chmod +x c.sh
[root@loaclhost shuzu1]#./c.sh
15
实例—乘法传参运算
[root@loaclhost shuzu1]#vim c.sh
#!/bin/bash
test3 () {
abc1=(`echo $@`)
for ((i=0;i<=$[$# - 1];i++)) #$#是原始数组的元素个数,这里是取出新数组的索引值,不减的话就是一个字符串
do
abc1[$i]=$[${abc1[$i]} * 2] #这里是将每个原始索引对应的元素值乘以2传到新的数组中对应的索引的元素中去
done
echo "${abc1[*]}" #输出新的数组
}
abc=(1 2 3)
test3 ${abc[*]}
[root@loaclhost shuzu1]#./c.sh
2 4 6
数组排序算法
冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想
- 冒泡排序的基本思想是对比相邻的两个元素值,
- 如果满足条件就交换元素值,把较小的元素移动到数组前面,
- 把大的元素移动到数组后面(也就是交换两个元素的位置) ,
- 这样较小的元素就像气泡一样从底部上升到顶部
算法思路
- 冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
- 在实际应用中,冒泡排序适用于对小规模数据进行排序
#!/bin/bash
abc=(20 10 60 40 50 30) #定义一个数组
echo "原数组的排列顺序为:${abc[*]}"
length=${#abc[*]} #定义原数组的长度为length变量
for ((i=1;i<$length;i++)) #定义排序轮次
do
echo $i
for ((k=0;k<$length-i;k++)) #确定第一个元素的索引位置
do
first=${abc[$k]} #定义第一个元素的值
j=$[$k+1] #定义第二个元素的索引号
second=${abc[$j]} #定义第二个元素的值
if [ $first -gt $second ] #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换
then
temp=$first #把第一个元素的值保存在临时变量temp中
abc[$k]=$second #把第二个元素的值赋给第一个元素
abc[$j]=$temp #把原第一个元素的值,赋给第二个元素
fi
done
done
echo "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
[root@loaclhost shuzu1]#./g.sh
原数组的排列顺序为:20 10 60 40 50 30
排序后数组的排列顺序为10 20 30 40 50 60
作业,使用df -h命令,对磁盘空间大小做正向排序
disk=(`df -h | awk 'NR>1 {print $5}' | tr -d '%'`)
echo ${disk[*]}
小结
从本章数组中得知了其中数字实际的用法,可以搭配shell脚本运用,使之更加方便快捷,还可以进行数据元素的锁定与筛选,也可以进行排序,从而进行整合替换