shell 编程之数组

一.数组介绍

1.定义数组的方法

常见的数组形式:(30 20 10 60 50 40)

数组的元素可使用的数据类型:数值 或 "字符串"(双引号)、 '字符串'(单引号)

(1)方法一

数组名=(元素1 元素2 元素3 ....)

[root@localhost day14]# array1=(10 20 30 40 50 60)    #定义数组
[root@localhost day14]# echo ${array1[@]}             #查看数组列表
10 20 30 40 50 60
[root@localhost day14]# echo ${array1[*]}             #查看数组列表
10 20 30 40 50 60

(2)方法二

数组名后面的数字是数组的下标,查看下标的方法是 echo ${!数组名[@]} 或  echo ${!数组名[*]}

数组名[0]=元素1

数组名[1]=元素2

数组名[2]=元素3

[root@localhost day14]# array1[6]="70"

[root@localhost day14]# array1[6]="80"

[root@localhost day14]# echo ${array1[*]}
10 20 30 40 50 60 80

(3)方法三

列表名="value0 value1 value2 ..."
数组名=($列表名)

[root@localhost day14]# list="11 22 33 44 55 66"

[root@localhost day14]# array2=($list)

[root@localhost day14]# echo ${array2[@]}
11 22 33 44 55 66
[root@localhost day14]# echo ${array2[*]}
11 22 33 44 55 66
[root@localhost day14]# 

(4)方法四

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

[root@localhost day14]# array3=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e" [5]="f")

[root@localhost day14]# echo ${array3[@]}
a b c d e f
[root@localhost day14]# echo ${array3[*]}
a b c d e f
[root@localhost day14]# 

2.查看数组的元素列表

echo ${数组名[@]}
echo ${数组名[*]}

 3.查看数组的长度(元素的个数)

echo ${#数组名[@]}
echo ${#数组名[*]}

4.查看数组的元素下标

echo ${!数组名[@]}
echo ${!数组名[*]}

查看具体某个下标的元素

echo ${数组名[下标]}

5.数组分片

echo ${数组名[@]:下标:长度}
echo ${数组名[*]:下标:长度}

6.数组字符替换

echo ${数组名[@]/旧字符/新字符}
数组名=(${数组名[*]/旧字符/新字符})      #通过重新定义的方式实现永久替换

7.数组的删除

unset 数组名[下标]      #删除数组的某个下标
unset 数组名            #删除数组

8.数组遍历和重新定义

arr=(1 2 3 4 5)
n=0
for i in ${arr[@]}
do
    arr[$n]=$[i*2]
    let n++
done

9.判断数组是否完整

#!/bin/bash
#根据下标判断数组是否完整

array1=(10 20 30 40 50 60)
array2=([0]="a" [1]="b" [2]="c" [3]="d" [5]="f")

length1=${#array1[@]}
length2=${#array2[@]}

last1=$[length1 -1]
last2=$[length2 -1]


last1_num=$(echo ${!array1[@]} | awk '{print $NF}')
last2_num=$(echo ${!array2[@]} | awk '{print $NF}')

if [ $last1 -eq $last1_num ];then
     echo "array1 为完整的数组"
else
     echo "array1 数组不完整"
fi          
            
            
if [ $last2 -eq $last2_num ];then 
     echo "array2 为完整的数组" 
else
     echo "array2 数组不完整"
fi    

可以通过使用 echo ${ ! 数组名 [@] } 指定下标来补全数组,但是仅限于数组完整的数组

10.数组追加元素

(1)方法一

数组名[新下标]=新元素

(2)方法二

数组名[数组长度]=新元素     (仅适用于完整的数组)

双引号不能省略,否则,当数组中存在包含空格的元素时会按空格将元素拆分成多个

不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

(3)方法三

数组名+=(新元素1 新元素2 ....)

(4)方法四

数组名=("${数组名[@]}" 新元素1 新元素2 ....)

11.数组传参

方法一

#!/bin/bash

test1() {

     echo "函数接收到的参数列表:$@" 

      在函数体内将传入的元素列表重新组成数组
      arr2=($@)
      遍历数组方法一
      echo "函数中新组成的数组为: ${arr2[@]}"

      n=0
      for i in ${arr2[@]}
      do
          #arr2[$n]=$[$i * 2]
          #let n++
      done
}

arr1=(50 40 30 20 10)

test1 ${arr1[@]}

方法二

 for ((i=0; i<${#srr2[@]}; i++))
      do
          arr2[$i]=$[${arr2[$i]} * 2]
      done
      #从函数返回数组
      echo ${arr2[@]}

}

arr1=(11 22 33 44 55 66)

#向函数传入数组
result=$(test1 ${arr1[@]})

#在函数体外将返回的值列表重新组成数组
arr1=($result)

#输出数组
echo "arr1 doule 以后的值为 ${arr1[@]}"

向函数传数组参数
函数名() {
     数组2=($@)         #在函数体内将传入的列表重新组成数组
     ....
}

函数名 ${数组1[@]}      #在函数体外将数组分解成列表传入


从函数返回数组
函数名(){
    ....
    echo ${数组2[@]}     #在函数体内以列表形式返回值
}

数组1=(函数名 参数)      #在函数体外将函数执行的结果重新组合成数组

 二.数组排序算法

1.冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

 

2.直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。

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

3.反转排序

以相反的顺序把原有数组的内容重新排序。

基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值