Linux之数组(除了头疼还有啥!)
作者:互联网
Linux之数组(除了头疼还有啥!)
文章目录
一、数组的概念
1.定义数组方法
数组:(30 20 10 60 50 40)
索引值:0 1 2 3 4 5
方法1:
数组名=(value0 value1 value2 …)
例:
[root@localhost ~]#qwe=(7 4 1 8 5 2)
[root@localhost ~]#echo ${qwe[*]}
7 4 1 8 5 2
[root@localhost ~]#echo ${qwe[@]}
7 4 1 8 5 2
方法2:
数组名=([0]=value [1]=value [2]=value …)
例:
[root@localhost ~]#asd=([0]=9 [1]=6 [2]=3)
[root@localhost ~]#echo ${asd[@]}
9 6 3
方法3:
列表名="value0 value1 value2 …"
数组名=($列表名)
例:
[root@localhost ~]#zxc="7 8 9 4 5 6"
[root@localhost ~]#qaz=($zxc)
[root@localhost ~]#echo ${qaz[@]}
7 8 9 4 5 6
方法4:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
例:
[root@localhost ~]#wsx[0]=3
[root@localhost ~]#wsx[1]=2
[root@localhost ~]#wsx[2]=1
[root@localhost ~]#echo ${wsx[@]}
3 2 1
2.数组包括的数据类型
1)数值类型
2)字符类型(字符串)
使用" "或’'定义,防止元素当中有空格,元素按空格分割
3.获取数组长度
arr_number=(1 2 3 4 5)
echo ${#arr_number[*]}
或者echo ${#arr_number[@]}
例:
[root@localhost ~]#arr=(9 5 1 7 5 3)
[root@localhost ~]#echo ${#arr[*]}
6
[root@localhost ~]#echo ${#arr[@]}
6
4.读取某个下标赋值
arr=(1 2 3 4 5)
echo ${arr[索引值]}
例:
[root@localhost ~]#arr=(9 5 1 7 5 3)
[root@localhost ~]#echo ${#arr[@]} #查看数组长度
6
[root@localhost ~]#echo ${arr[0]} #查看索引为0的参数
9
[root@localhost ~]#echo ${arr[1]}
5
[root@localhost ~]#echo ${arr[2]}
1
[root@localhost ~]#echo ${arr[3]}
7
二、数组的处理
1.数组遍历
[root@localhost ~]#vim bianli.sh
[root@localhost ~]#chmod +x bianli.sh
[root@localhost ~]#./bianli.sh
1
2
3
4
5
[root@localhost ~]#cat bianli.sh
#!/bin/bash
arr2=(1 2 3 4 5) #定义数组
for i in ${arr2[*]} #依次输出每个索引所对应的参数
do
echo $i
done
2. @ 和 @和 @和*的区别
$@和$*的区别
两者没加""是什么区别
加上""
$* 将数组中的数据作为一个整体使用
$@ 将数组中每个参数分别作为单个的个体使用
$# 显示的是参数的数量,也可称为长度
3.数组切片
[root@localhost ~]#cat qiepian.sh
arr=(1 2 3 4 5 6)
echo ${arr[@]} #输出整个数组
echo ${arr[@]:0:2} #获取${数组名[@或*]:起始位置:长度}的值
echo ${arr[@]:1:3} #输出起始索引为1的后面的三个参数的值
[root@localhost ~]#./qiepian.sh
1 2 3 4 5 6
1 2
2 3 4
4.数组替换
格式:${数组名[*或@]/源参数值/将要替换的参数值}
arr=(1 2 3 24 6)
#临时替换:将数组arr1中的参数值4替换为66,但原来的数组中的参数值并不会改变
echo ${arr[*]/4/66}
echo ${arr[*]}
#永久替换:可通过重新赋值实现
arr=(${arr[*]/4/66})
echo ${arr[*]}
例:
5.数组删除
格式:unset 数组名[索引] #删除单个
或unset 数组名 #删除整个数组
例:
6.数组追加
方法一:通过使用索引在数组最后添加参数。
需要知道数组中有多少参数,以及没有对数组进行任何删减
[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr[6]=7
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7
方法二:未进行过任何删减的情况下,最后一个索引值加1也就是要添加的参数对应的索引值
[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr[${#arr[*]}]=7
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7
方法三:直接获取源数组的全部元素再加上新要添加的元素,一并重新赋予该数组,重新刷新定义索引,可以避免中间有删减的情况
[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr=("${arr[@]}" 7 8)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7 8
注:双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个 不能将“@”替换为“*”,如果替换为“* ”,不加双引号时与“@”的表现一致,加双引号时,会将数组arr中的所有元素作为一个元素添加到数组中
方法四:使用arr+=(元素 元素 元素)添加
[root@localhost ~]#arr=(1 2 3 4 5 6)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6
[root@localhost ~]#arr+=(7 8 9)
[root@localhost ~]#echo ${arr[*]}
1 2 3 4 5 6 7 8 9
三、数组传参给函数
1.如果将数组变量作为函数参数,函数只会取数组变量的第一个值
[root@localhost ~]#vim test1.sh
[root@localhost ~]#cat test1.sh
#!/bin/bash
test1 () {
echo "接受到的参数列表:$@"
abc2=$1
echo "新数组的值为:${abc2[*]}"
}
abc=(3 2 1 4 5)
echo "原始数组的值为:${abc[*]}"
test1 $abc
[root@localhost ~]#chmod +x test1.sh
[root@localhost ~]#./test1.sh
原始数组的值为:3 2 1 4 5
接受到的参数列表:3
新数组的值为:3
2.解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。
[root@localhost ~]#vim test2.sh
[root@localhost ~]#cat test2.sh
#!/bin/bash
test2 () {
abc1=($(echo $@)) #也可表示为 abc1=(`echo $@`)
echo "新数组的值为:${abc1[*]}"
}
abc=(3 2 1 4 5)
echo "原始数组的值为:${abc[*]}"
test2 ${abc[*]}
[root@localhost ~]#chmod +x test2.sh
[root@localhost ~]#./test2.sh
原始数组的值为:3 2 1 4 5
新数组的值为:3 2 1 4 5
3.从函数返回数组
[root@localhost ~]#vim test3.sh
[root@localhost ~]#cat test3.sh
#!/bin/bash
test3 () {
abc3=(`echo $@`)
for ((i=0;i<=$[$# - 1];i++)) #$#是原始数组的元素个数,这里是取出新数组的索引值是从0-4
do
abc3[$i]=$[${abc3[$i]} * 2] #这里是将每个原始索引对应的元素值乘以2传到新的数组中对应的索引的元素中去
done
echo "${abc3[*]}" #输出新的数组
}
abc=(2 3 1 5 4)
test3 ${abc[*]}
[root@localhost ~]#chmod +x test3.sh
[root@localhost ~]#./test3.sh
4 6 2 10 8
四、数组排序算法
1.冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置) ,这样较小的元素就像气泡一样从底部上升到顶部
算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
[root@localhost ~]#vim mppx.sh
[root@localhost ~]#cat mppx.sh
#!/bin/bash
array=(60 20 30 50 10 40) #定义一个数组
echo "原数组参数顺序为:${array[*]}"
for ((i=1;i<${#array[*]};i++)) #定义排序轮次
do
for ((a=0;a<${#array[*]}-i;a++)) #确定第一个元素的索引位置
do
if [ ${array[$a]} -gt ${array[$a+1]} ] #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换
then
temp=${array[$a]} #把第一个元素的值保存在临时变量temp中
array[$a]=${array[$a+1]} #把第二个元素的值赋给第一个元素
array[$a+1]=$temp #把原第一个元素的值,赋给第二个元素
fi
done
done
echo "冒泡排序后,数组顺序为:${array[*]}"
[root@localhost ~]#chmod +x mppx.sh
[root@localhost ~]#./mppx.sh
原数组参数顺序为:60 20 30 50 10 40
冒泡排序后,数组顺序为:10 20 30 40 50 60
2.直接选择排序
与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。
基本思想:
将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序) ,这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
[root@localhost ~]#vim zjpx.sh
[root@localhost ~]#cat zjpx.sh
#!/bin/bash
abc=(63 4 24 1 3 15) #定义一个数组
echo "原数组的排列顺序为${abc[*]}"
length=${#abc[*]} #定义原数组的长度,这里原数组的长度为6
for ((i=1;i<$length;i++)) #这里是定义比较的轮数,比较5次
do
index=0 #表示从索引0开始比较
for ((k=1;k<=$length-i;k++)) #这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索引0开始了,所以和0进行比较的范围就是从索引1-5了
do
first=${abc[$k]} #定义与index相比较的索引的取值为first
if [ $first -gt ${abc[$index]} ] #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大元素的索引位置
then
index=$k #通过比较将较大的数定义到index中,进行下一轮的比较
fi
last=$[$length-$i] #获取在比较的范围中的最后一个元素的索引
temp=${abc[$last]} #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中
abc[$last]=${abc[$index]} #把最大上面for循环比较出来的最大元素的值赋值给最后一个元素
abc[$index]=$temp #把原来最后一个元素的值赋给原来最大值的位置的元素
done
done
echo "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
[root@localhost ~]#chmod +x zjpx.sh
[root@localhost ~]#./zjpx.sh
原数组的排列顺序为63 4 24 1 3 15
排序后数组的排列顺序为1 3 4 15 24 63
3.反转排序
以相反的顺序把原有数组的内容重新排序。
基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。
[root@localhost ~]#vim fzpx.sh
[root@localhost ~]#cat fzpx.sh
#!/bin/bash
array=(60 20 30 50 10 40)
echo "反转前顺序:${array[*]}"
length=${#array[*]}
for ((i=0;i<$length/2;i++))
do
temp=${array[$i]}
array[$i]=${array[$length-1-$i]}
array[$length-1-$i]=$temp
done
echo "反转排序后:${array[*]}"
[root@localhost ~]#chmod +x fzpx.sh
[root@localhost ~]#./fzpx.sh
反转前顺序:60 20 30 50 10 40
反转排序后:40 10 50 30 20 60
标签:头疼,arr,echo,sh,数组,Linux,root,localhost 来源: https://blog.csdn.net/qq_35456705/article/details/112000218