Linux:数组

一、数组

1.1 数组的数据类型

  • 数值类型
  • 字符类型使用“ ”或‘ ’对其内参数进行定义

1.2 数组的定义方法

  • 方法一
数组名=(value value value ...)                        #给一组字符串两边加上以空格相间隔的括号,默认下标从左往右依次为0,1,2,3...#
  • 方法二
数组名=([0]=value [1]=value [3]=value ...]            #给每个字符串设置下标,下标2没有则默认是空值,当然`下标顺序也可以不按照顺序来`,但是`输出元素时仍是按照下标从小到大来`#
  • 方法三
列表名="vlaue value value ..."                        #跟方法一有点类似#
数组名=($列表名)                                       
  • 方法四
数组名[0]="value" 数组名[1]"value" 数组名[2]"value" ... #太繁琐,可根据具体情况来#

1.3 获取数组长度

arr_number=(1 2 3 4 5)
echo ${#arr_number[@]} #输出该数组的长度,“@”可跟“*”互换#
5
arr_number=(1 2 3 4 5)
echo ${arr_number[@]} #输出该数组的元素#
1 2 3 4 5
arr_number=(1 2 3 4 5)
echo ${arr_number[3]} #输出下标为3时的元素,从左往右下标是0~4,所以输出的是数字4#
4
arr_number=([0]=a [1]=b [3]=c [5]=d [4]=e)
echo ${arr_number[@]}  #输出该数组的参数,下标2没有默认是空值,而下标4的值是e,下标5的值是的,所以是e d
#
a b c e d
echo ${!arr_number[@]} #查看所有下标,一眼可以看出该数组是否齐全#
0 1 3 4 5

在这里插入图片描述

1.3.1 脚本判断数组中是否有空值

  • 直接用上面的命令 echo {!数组名[@]} 就可以
  • 或者用脚本判断
#!/bin/bash
array=([0]=30 [1]=10 [3]=20 [4]=50)             #定义数组#
length=${#array[@]}                             #数组的长度#
lastnum=$[length - 1]                           #数组的最高下标值#
lastone=${array[$lastnum]}                      #最高下标值对应的参数#
crulast=$(echo ${array[@]} | awk '{print $NF}') #从数组列表出取出最后一个的值#

echo "array数组的值为:${array[@]}"

if [ $lastone == $curlast ];then                #如果最高下标的值跟数组列表中最后一个值相等,说明没有哪个下标对应值是空值,反之则有空值#
   echo "array数组是完整的"
else
   echo "array数组缺少元素"
fi

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

1.4 数组切片

array=123456abc
echo ${array[@]:4:3 
56a
array=(11 22 33 44 55)
echo ${array[@]:2:1} 
33
echo ${array[@]:2:3}
33 44 55

在这里插入图片描述

1.5数组替换

array=(1 2 3 4 5)
echo ${array[@]/4/6}
1 2 3 6 5

在这里插入图片描述

array=(23 45 89 100 77 64)
echo ${array[@]/4/a}
23 a5 89 100 77 6a

在这里插入图片描述

  • 如果想要修改的值永久生效可即可以用 变量名=(${变量名[@]/旧字符/新字符})

1.6 删除数组

array=(11 22 33 44 55)
unset array[1]          #删除对应下标的元素#
unset array             #删除数组#

在这里插入图片描述

1.7 数组追加

  • 方法一
array(1 2 3 4 5)
array[5]=6         #数组名[下标]=value,新的下标代表的是追加,已有的下标则会覆盖#
echo ${array[@]}
1 2 3 4 5 6

在这里插入图片描述

  • 方法二
array=(1 2 3 4 5)
array[${#array[@]}]=a #此方法一定要确认数组完整,否则只能更改最后一个下标的值#
echo ${array[@]}
1 2 3 4 5 a

在这里插入图片描述

  • 方法三(此方法注意点有点多,细看
array=(1 2 3 4 5)
array=("${array[@]}" "a" "zhang san") #此处双引号不能省略,否则当数组名中存在包含空格的元素时会按照空格将元素拆分成多个。也不能用“*”代替“@”,不加双引号,两个符号效果一样,加了双引号,“*”会将数组名中的元素作为一个整体元素添加到数组中#
1 2 3 4 5 a zhang san

在这里插入图片描述

  • 方法四
array=(1 2 3 4 5)
array+=(a  ac)     #追加的值要用括号括起来,如果有空格之类的还要用双引号引起来,不然会当成多个元素输出#
echo ${array[@]}
1 2 3 4 5 a ac

在这里插入图片描述

1.8 数组传参

  • 脚本内,你输入一组参数,函数默认只能传入第一个参数,所以我们需要把它在函数外定义成数组,函数内部再输出这些内容

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

1.9 冒泡排序(将数组中的值按照顺序排列)

在这里插入图片描述

#!/bin/bash
#冒泡排序(将数组中的值按照顺序排列)
MAOPAO() {
arr=($@)
length=${#arr[@]}
for ((a=1;a<length;a++))              #外层循环定义比较几轮,比较的轮数为数组长度减1且是从1开始
do
    for ((b=0;b<length-a;b++))        #内层循环用来确定比较元素的位置,从下标是0的参数开始,较大的元素往后移,并且比较次数会随着轮数的增加而减少 
    do
      first=${arr[$b]}                #获取相邻两个元素的前面元素的值
      c=$[b + 1]
      second=${arr[$c]}               #获取相邻两个元素的后面元素的值
        if [ $first -lt $second ];then
          tmp=$first                  #使用临时变量保存前面元素的值,实现两个相邻元素交换位置
          arr[$b]=$second
          arr[$c]=$tmp
        fi
     done
done

echo "冒泡排序后的数组的值为: ${arr[@]}" 
}


### main ###
read -p "请输入一组列表:" num
array=($num)
echo "旧的冒泡的数组的值为: ${array[@]}"
MAOPAO ${array[@]}

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

1.9.1 直接选择排序(将数组中的值按照顺序排列)

在这里插入图片描述

#!/bin/bash
#直接选择排序(将数组中的值按照顺序排列)
arr=(63 4 24 1 3 15)
echo "排序前的数组的值为: ${arr[@]}"
length=${#arr[@]}
for ((a=1;a<length;a++))                  #外层循环定义排序的轮数,为数组长度减1且从1开始
do
  i=0                                     #每轮比较的初始最大的元素作下标,从0开始,即第一个元素
  for ((b=1;b<=length-a;b++))             #内层循环定义用于与当前最大元素作比较的元素下标范围,从1开始,且每轮比较的最后一个元素下标>会随着轮数增加而减少
  do
    if [ ${arr[$i]} -lt ${arr[$b]} ];then #通过比较,获取当前轮数中最大元素的下标
      i=$b
    fi
  done
  last=$[length-a]                        #获取当前轮数的最后一个元素的下标
  tmp=${arr[$last]}                       #先用临时变量获取当前轮数的最后一个元素的值
  arr[$last]=${arr[$i]}                   #将最大元素的值赋给当前轮数的最后一个元素
  arr[$i]=$tmp                            #将临时变量的值,即原最后一个元素的值交换
done
echo "排序后的数组的值为: ${arr[@]}"

在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值