【shell脚本里的数组】

文章介绍了如何在Shell脚本中定义数组,包括四种不同的定义方法,并展示了检查数组是否有缺失元素、生成数组、切片、替换元素等操作。此外,还详细说明了如何向函数传入数组值以及从函数返回数组的方法。


一、数组的定义方法

20  10  60  50  70 )   #以空格相间隔的数组
   0   1   2   3   4      #下标

1、定义数组

方法一:
数组名=( 元素1 元素2 元素3 ...)

方法二:
数组名=[0]=1 [1]=2 [2]=3 ...)
#每个元素的下标所对应的值

方法三:
列表名=“ 值123 ...”
数组名=($列表名)

方法四:
数组名[0]="值1"
数组名[1]="值2"
数组名[2]="值3"
数组名[3]="值4"

数组包括的数据类型
数值类型
字符串类型: 使用字符类型时要使用 “ ” 或者 ’ ’来定义

 1、获取数组的所有元素的列表
$(数组名[*]) 或者 $(数组名[@])
  
2、获取数组的所有元素下标
${!数组名[@]}   ${!数组名[*]}    

3、统计数组的元素的长度和个数
${#数组名[*]}
${#数组名[@]}

4、获取数组的某个元素的值
${数组名[下标]}
   
5、删除数组某个元素
unset  数组[下标]  

6、删除数组
unset  数组          

7、数组切片,获取从数组的某个下标开始的多少个元素
${数组[@]:下标:长度}    


8、数组字符替换
${数组[@]/旧字符/新字符}   

在这里插入图片描述

怎么查看数组里有没有缺少元素值:
就使用总元素数量减去1,用减1的数值来查看是不是与最后一个元素值一样,一样就是没有缺少元素值,反之不一样就是缺少元素值

在这里插入图片描述

1.1、使用shell脚本来写出怎么查看这个数组有没有缺少元素

#!/bin/bash
#定义数组名和数组里面的值,来查看有没有缺少元素
array3=([0]=30 [1]=20 [2]=10  [3]=40 [5]=50 [4]=60)

length=${#array3[@]}
lastnum=$[length - 1]
lastone=${array3[$lastnum]}
curlast=$(echo ${array3[@]} | awk '{print $NF}') 
  #print $NF  显示最后一个字段 


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

if [ $lastone -eq $curlast  ]
then
     echo "array3数组是完整的"
else
     echo "array3数组是缺少元素的"
fi

在这里插入图片描述

1.2、使用shell脚本,来生成数组

#!/bin/bash

a=0
for i in 10 20 30 40 50    #指定数组里,每个的值
do
   array5[$a]=$i
   let a++
done

echo ${array5[@]}

算出元素的总和值
在这里插入图片描述

1.3、元素的切片

[root@dz666 ~]# echo ${array4[@]}   
11 22 33 44 55
[root@dz666 ~]# echo ${array4[@]:1:3}  
#先跟上数组的列表的表达式:初始元素的下标:获取的长度
22 33 44

替换元素值

[root@dz666 ~]# echo ${array4[@]}
11 22 33 44 55
[root@dz666 ~]# echo ${array4[@]/33/88}
11 22 88 44 55
[root@dz666 ~]# echo ${array1[@]}
10 30 40 50
[root@dz666 ~]# echo ${array1[@]/0/8}
 #匹配到的字符串全都替换掉
 18 38 48 58

实现永久替换
重新赋值

[root@dz666 ~]# echo ${array1[@]}
10 30 40 50
[root@dz666 ~]# array1=(${array1[@]/10/60})
在数组外加上一个括号来进行替换
[root@dz666 ~]# echo ${array1[@]}
60 30 40 50

unset 来删除组和

[root@dz666 ~]# echo ${!array1[@]}
0 1 2 3
[root@dz666 ~]# unset array1[3]  
 #删除数组某个元素
[root@dz666 ~]# echo ${!array1[@]}
0 1 2

[root@dz666 ~]# unset array1    
#删除数组
[root@dz666 ~]# echo ${!array1[@]}

[root@dz666 ~]# 

二、数组追加元素

方法一:
[root@dz666 ~]# echo ${array4[@]}
11 22 33 44 55
[root@dz666 ~]# array4[5]=66
[root@dz666 ~]# echo ${array4[@]}
11 22 33 44 55 66

方法二:
[root@dz666 ~]# array4[${#array4[@]}]=77
#根据数组的长度来判断,只针对完整的数组来执行
[root@dz666 ~]# echo ${array4[@]}
11 22 33 44 55 66 77

方法三:
#双引号不能省略,否则,当数组array name中存在包含空格的元素时会按空格将元素拆分成多个
不能将"@"替换为"*",如果替换为"*",不加双引号时与"@"的表现一致,加双引号时,会将数组array中的所有元素作为一个元素添加到数组中

[root@dz666 ~]# array2=('zhang san' 'li si' 'wang wu' 'wo long' )
[root@dz666 ~]# echo ${array2[@]}
zhang san li si wang wu wo long
[root@dz666 ~]# echo ${#array2[@]}
4
[root@dz666 ~]# arr2=(${array2[@]})
[root@dz666 ~]# echo ${arr2[@]}
zhang san li si wang wu wo long
[root@dz666 ~]# echo ${#arr2[@]}
8      
#不加上引号的话就会将一个空格为一个值,拆分为多个元素


[root@dz666 ~]# arr2=("${array2[*]}")
 #如果这里面写如星号时,下面的数组就会作为一个整体
 
[root@dz666 ~]# echo ${arr2[@]}
zhang san li si wang wu wo long
[root@dz666 ~]# echo ${#arr2[@]}
1

#使用@时就会显示全部的元素值
[root@dz666 ~]# arr2=("${array2[@]}")
[root@dz666 ~]# echo ${arr2[@]}
zhang san li si wang wu wo long
[root@dz666 ~]# echo ${#arr2[@]}
4

#直接在后面加上要加的元素值
[root@dz666 ~]# arr2=("${array2[@]}" "fengchu" "nb" "haohen")
[root@dz666 ~]# echo ${arr2[@]}
zhang san li si wang wu wo long fengchu nb haohen
[root@dz666 ~]# echo ${#arr2[@]}
7
[root@dz666 ~]# 

方法四:
[root@dz666 ~]# echo ${array2[@]}
zhang san li si wang wu wo long
[root@dz666 ~]# echo ${#array2[@]}
4

#使用 数组+= 直接在后面添加元素
[root@dz666 ~]# array2+=("nitaihenl" "taibangl")
[root@dz666 ~]# echo ${array2[@]}
zhang san li si wang wu wo long nitaihenl taibangl
[root@dz666 ~]# echo ${#array2[@]}
6

三、传输和传出

1、向函数传入数组的值

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

#!/bin/bash


test1() {
   #函数内通过$@能获取到调用函数时后面跟的所有参数,加上()可在函数内组成新的数组
   newarr=($@) 

#对函数内组成的新数组处理后,按照元素列表格式输出,在函数题外调用函数的表达式外加上()再组成新的数组
   echo "函数内的数组的元素列表为: ${newarr[@]}"

}

###main###

#调用函数时后面跟的参数为数组的元素列表表达式
arr=(10 20 30 40 50 )
echo "函数外的数组的元素列表为: " ${arr[@]}
test1 ${arr[@]}

在这里插入图片描述

2、从函数返回数组

#!/bin/bash
#定义函数
array() {
  #将调用函数后的所有参数定义为newarr
   newarr=($@)
  #下标i的范围从0开始,小于参数的个数。下标最大为数组参数个数减1
   for ((i=0;i<${#newarr[@]};i++))
   do
       newarr[$i]=$[${newarr[$i]} * 2]
      #将原有数组的值乘2
   done
#将处理过的值进行输出
 echo ${newarr[@]}
}
 
###main###
 
read -p "输入一个数组:" num
#将调用函数后输出的值定义为一个新数组arr,设置新的数组时要在数组外加上括号成为新数组
arr=($(array $num))
echo "新数组的值为${arr[@]}"

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值