shell脚本之数组

网友投稿 311 2022-11-04

shell脚本之数组

一、数组的概念

1、定义数组

方法一:数组名=(value0 value1 value2 …)

(1)数值类型 (2)字符类型(字符串) 使用" "或''定义,防止元素当中有空格,元素按空格分割

3、索引(下标)

第一个索引始终是数字 0,且添加到数组中的每个后续元素的索引以 1 为增量递增 例如数组abc=(a b c d);第一个数据a的索引就是0,第二个数据b的索引就是1,以此类推。

4、获取数组长度

arr_number=(1 2 3 4 5) echo ${#arr_number[*]}

5、读取某个下标赋值

arr=(1 2 3 4 5) echo ${arr[索引值]}

二、对数组进行操作

1、数组遍历

#!/bin/bash arr5=(1 2 3 4 5) for i in ${arr5[*]} do echo $i done

2、补充:$@和$*的区别

$@和$*的区别 两者没加""是什么区别 加上"" $* 将数组中的数据作为一个整体使用 $@ 将数组中每个参数分别作为单个的个体使用 $# 显示的是参数的数量,也可称为长度 123456

3、数组切片

arr1=(1 2 3 4 5 6) echo ${arr1[*]} echo ${arr1[@]} #输出整个数组,此处*与@相同 echo ${arr1[@]:0:2} #获取 ${数组名[@或*]:起始位置:长度} 的值

4、数组替换

格式:${数组名[*或@]/源参数值/将要替换的参数值} arr2=(1 2 3 4 5) #临时替换:将数组arr1中的参数值4替换为66,但原来的数组中的参数值并不会改变 echo ${arr2[*]/4/66} echo ${arr2[*]} #永久替换:可通过重新赋值实现 arr2=(${arr2[*]/4/66}) echo ${arr2[*]}

5、数组删除

格式:unset 数组名[索引] #删除单个 或unset 数组名 #删除整个数组 #删除单个参数值 arr3=(1 2 3 4 5) echo ${arr3[*]} unset arr3[2] echo ${arr3[*]} #删除数组 unset arr3 echo ${arr3[*]}

6、数组追加

方法一:单个添加,需要知道数组中有多少参数,以及没有对数组进行任何删减

arr4=(1 2 3 4 5 6 7) echo ${arr4[*]} arr4[7]=8 #指定索引添加参数 echo ${arr4[*]}

arr4=(1 2 3 4 5 6 7) echo ${arr4[*]} arr4[${#arr4[*]}]=8 #根据长度添加参数 echo ${arr4[*]}

arr4=(1 2 3 4 5 6 7) echo ${arr4[*]} arr4=("${arr4[@]}" 8 9 10) #加上新参数重新定义数组 echo ${arr4[*]} 双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个 不能将“@”替换为“*”,如果替换为“* ”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

arr4=(1 2 3 4 5 6 7) echo ${arr4[*]} arr4+=(10 11 12) #添加参数,这种方法用的比较多 echo ${arr4[*]}

7、数组传参给函数

(1)如果将数组变量作为函数参数,函数只会取数组变量的第一个值

#!/bin/bash test1 () { echo "接受到的参数列表:$@" newarrary=$1 echo "新数组的值为:${newarrary[*]}" } array=(3 2 1 4 5) echo "原始数组的值为:${array[*]}" test1 $array #将数组变量作为函数的参数,只会取数组变量的第一个值

test2() { newarrary=($(echo $@)) echo "新数组的值为:${newarrary[*]}" } array=(3 2 1 4 5) echo "原始数组的值为:${array[*]}" test2 ${array[*]}

#!/bin/bash qiuhe () { arr1=(`echo $@`) sum=0 for i in ${arr1[*]} do sum=$[$sum + $i] done echo "数组内相加结果为:$sum" } chengfa () { arr2=(`echo $@`) for ((i=0;i<=$[$# - 1];i++)) do arr2[$i]=$[${arr2[$i]} * 2] done echo "乘法运算后的数组为:${arr2[*]}" } arr=(3 2 1 4 5) test2 ${arr[*]} test3 ${arr[*]}

三、数组排序算法

1、冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。 基本思想:冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。 算法思路:冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

#!/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]} array[$a]=${array[$a+1]} array[$a+1]=$temp fi done done echo "经过冒泡排序后,数组顺序为:${array[*]}"

2、直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度更快。 基本思想:将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

#!/bin/bash array=(60 20 30 50 10 40) echo "原数组元素顺序为:${array[*]}" long=${#array[*]} for ((i=1;i<$long;i++)) do index=0 for ((a=1;a<=$long-$i;a++)) do if [ ${array[$a]} -gt ${array[$index]} ] then index=$a fi last=$[$long-$i] temp=${array[$last]} array[$last]=${array[$index]} array[$index]=$temp done done echo "经过直接排序后数组元素顺序为:${array[*]}"

3、反转排序

以相反的顺序把原有数组的内容重新排序 基本思想:把数组最后一个元素与第一个元素替换。倒数第二个元素与第二个元素替换,以此类推,直到把所有的数组元素反转替换完

#!/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[*]}"

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:从医学尝试到初步商业化 脑机接口技术刚刚开始蓬勃发展
下一篇:Spring5中SpringWebContext方法过时的解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~