shell之数组

Posted 阳光小王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell之数组相关的知识,希望对你有一定的参考价值。

数组

数组的定义

1.方法一

数组名=(value0  value1  value2)

在这里插入图片描述

2.方法二

数组名=[0]=value [1]=value [2]=value )

在这里插入图片描述

3.方法三

列表名=“value0 value1 value2 …”
数组名=($列表名)

在这里插入图片描述

4.方法四

数组名[0]=“value”
数组名[1]=“value”
数组名[2]="value"

在这里插入图片描述

获取数组长度

定义数组:sz
[root@localhost 1]# sz[0]="10"
[root@localhost 1]# sz[1]="20"
[root@localhost 1]# sz[2]="30"
--------------------------------
获取数组长度
[root@localhost 1]# len=${#sz[@]/[*]}   //定义len为变量,获取数组长度,可用@*
[root@localhost 1]# echo $len
3

在这里插入图片描述

1.读取下标赋值

下标赋值读取:
xbfz=${sz[1]}   //读取数组下标为1的值
echo $xbfz      //输出下标为1的数组值

在这里插入图片描述

2.获取数据列表

1.echo ${sz[*]}
2.echo ${sz[@]}   //*@都可以

数组的遍历

[root@localhost 1]# a=(10 20 30 40 50 60)   //定义数组
[root@localhost 1]# list=${a[*]}            //将数组列表赋值给list
[root@localhost 1]# echo $list  
10 20 30 40 50 60
[root@localhost 1]# for i in $list   //使用for循环遍历数组
> do
> echo $i
> done
10
20
30
40
50
60

在这里插入图片描述

数组的切片、替换与删除

数组的切片

[root@localhost 1]# a=(10 20 30 40 50 60)   //定义数组
[root@localhost 1]# echo ${a[*]}    //输出数组列表
10 20 30 40 50 60
echo ${a[*]:1:2}       //获取 ${数组名[@或*]:起始位置:长度} 的值
20 30

在这里插入图片描述

数组的替换

[root@localhost 1]# echo ${a[*]}
10 20 30 40 50 60
[root@localhost 1]# echo ${a[*]/6/50}
10 20 30 40 50 500    //临时替换,不会替换原数组内容

===============================================
永久替换:
[root@localhost 1]# yjth=${a[*]/2/300}  //先将替换完成的数组赋值给yjth
[root@localhost 1]# echo ${yjth[*]}     //输出yjth
10 3000 30 40 50 60

在这里插入图片描述
在这里插入图片描述

数组的删除

[root@localhost 1]# a=(10 20 30 40 50 60 70)  
[root@localhost 1]# echo ${a[*]}
10 20 30 40 50 60 70
[root@localhost 1]# unset a              //删除整个数组
[root@localhost 1]# echo ${a[*]}
                                        //删除数组后输出为空值
[root@localhost 1]# a=(10 20 30 40 50 60 70)  
[root@localhost 1]# echo ${a[*]}
10 20 30 40 50 60 70
[root@localhost 1]# unset a[2]          //删除第三个元素
[root@localhost 1]# echo ${a[*]}
10 20 40 50 60 70

在这里插入图片描述

数组追加元素

方法一:

[root@localhost 1]# a=(10 20 30)
[root@localhost 1]# a[3]=40
[root@localhost 1]# echo ${a[*]}
10 20 30 40

方法二:

[root@localhost 1]# a=(10 20 30)
[root@localhost 1]# a[3]=40   //方法一
[root@localhost 1]# a[${#a[*]}]=50  //方法二
[root@localhost 1]# echo ${a[*]}    //输出数组a
10 20 30 40 50

方法三:

[root@localhost 1]# echo ${a[*]}
10 20 30 40 70 80
[root@localhost 1]# a=("${a[@]}" 60 70 80)  //方法三,@不可用*代替,“”不能少
[root@localhost 1]# echo ${a[*]}
10 20 30 40 70 80 60 70 80

方法四:

  • 待添加元素必须用“()”包围起来,并且多个元素用空格分隔
a+=(100 200 300 ...)

在这里插入图片描述

向函数传数组参数

#!/bin/bash

a() {
echo "函数接收到的参数列表为:$@"  //$@表示调用函数时后面跟的所有列表
newarr=($@)
echo "函数中新的数组值为:${newarr[@]}"
}

============主程序=================
arr=(10 20 30 40 50)
echo "原有数组为:${arr[@]}"

a ${arr[@]}

=============运行结果===============

[root@localhost 1]# bash demo1.sh
原有数组为:10 20 30 40 50
函数接收到的参数列表为:10 20 30 40 50
函数中新的数组值为:10 20 30 40 50

从函数返回数组

#!/bin/bash
#求数组中所有元素的累加和

a () {
newarr=($@)
arrlist=${newarr[*]}       //将数组先转换成列表arrlist
sum=0

for i in $arrlist          
do
    sum=$[$sum + $i]
done
    echo $sum
}
====把原数组所有元素值*2后生成一个新的数组并输出====
b () {
newarr1=($@)
len=${#newarr1[@]}           //获取数组长度
for ((j=0; j<$len; j++))
do
     newarr1[$j]=$[${newarr1[$j]} * 2]    //下标引索对应的数组参数值*2
done
     echo ${newarr1[*]}

}

==============主程序=================
array=(10 20 30 40 50)
echo "原数组的列表为:${array[@]}"

res1=`a ${array[@]}`
echo "a数组中的累加和为:$res1"

res2=$(b ${array[@]})
echo "b数组中的值为:$res2"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数组排序算法

冒泡排序

  • 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
  • 基本思想
    冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部
  • 算法思路
    冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
#!/bin/bash
//定义一个乱序数组
arr=(10 30 20 50 40 60)
//获取数组长度
len=${#arr[*]}
//外重循环控制比较轮数,比较轮数小于等于数组长度减一,并且比较轮数从1开始
for ((i=1; i<$len; i++))
do
//内重循环相信两个数比较大小,大的往后放,从下标引索0对应的值开始比较,比较次数随着比较轮减少而减少
    for((j=0; j<$len-$i; j++))
    do
//获取第一个下标索引对应的数组元素值
       first=${arr[$j]}
//获取第二个下标索引对应的数组元素值
       dr=$[$j + 1]
       second=${arr[$dr]}
//判断相邻两个元素值的大小,大的往后放,小的往前放,如果第一个元素值大于第二个元素值
       if [ $first -gt $second ]; then
//定义一个临时变量,将第一个元素值赋值给临时变量,第二个元素值给第一个,临时变量给第二个
          temp=${arr[$j]}
          arr[$j]=$second
          arr[$dr]=$temp
       fi
    done
done
//输出排序后的数组
echo "排序后的数组为:${arr[*]}"

直接选择排序

  • 基本思想
  • 将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式
#!/bin/bash

read -p "请输入一个数组列表:" list
arr=($list)
length=${#arr[@]}
//输出从键盘输入的原数组元素
echo "原数组的顺序为:${arr[@]}"
for ((i=1;i<$length;i++))
以上是关于shell之数组的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

Linux Shell系列教程之Shell数组

Linux shell之数组

shell之数组

shell编程之数组

shell之数组的使用