Shell函数——数组

目录

数组概述

数组的定义方法

方式一

方式二

方式三

方式四

获取数组数据列表及数组长度

获取数据列表

获取数组长度

读取数组中某下标赋值及数组遍历

读取数组中某下标赋值

数组遍历

数组切片、替换及删除

数组切片

数组替换

数组删除

数组追加元素

方式一

方式二

方式三

方式四

数组传参

将数组的参数传参到函数内

方式一

方式二

方式三

将函数里的值返回到数组

方式一

方式二


数组概述

  •  Shell中的数组是一维数组,不支持多维数组
  •  数组不一定全数字也可是字符串
  •  数组以空格为分隔,单位是元素
  •  索引(序号)从0开始,索引即每个元素所对应的下标
  •  数组是用括号括起来的,用引号括起来的是列表

数组的定义方法

  •  数组包括的数据类型
    • 数值类型
    • 字符类型
  •  使用" "或’ ’ 定义
  •  用引号引起来是防止字符中有空格从而使一个字符变成多个元素

方式一

[root@localhost ~]# sz=(20 30 40 10 50)

[root@localhost ~]# echo ${sz[*]}

20 30 40 10 50

方式二

[root@localhost ~]# sz1=([0]=20 [4]=50 [1]=30 [2]=40 [3]=10) 

【用索引进行定义,即索引0=20、索引3=10】

[root@localhost ~]# echo ${sz1[*]}

20 30 40 10 50

方式三

[root@localhost ~]# lb="20 30 40 10 50"      【先定义列表=20 30 40 10 50】
[root@localhost ~]# sz2=($lb)                【再定义数组sz2=列表lb的值】
[root@localhost ~]# echo ${sz2[*]}
20 30 40 10 50

方式四

  •  方法四可用来修改某个指定数组的值

[root@localhost ~]# sz3[4]="50"      【定义数组sz3的索引4值为50】
[root@localhost ~]# sz3[3]="10"
[root@localhost ~]# sz3[2]="40"
[root@localhost ~]# sz3[0]="20"
[root@localhost ~]# echo ${sz3[*]}  
20 40 10 50                         【查看后发现漏定义索引1的值】
[root@localhost ~]# sz3[1]="30"
[root@localhost ~]# echo ${sz3[*]}  【可以再次补定义索引1的值】
20 30 40 10 50

获取数组数据列表及数组长度

获取数据列表

[root@localhost ~]# sz1=(1 2 3)
[root@localhost ~]# echo ${sz3[*]}
20 30 40 10 50
[root@localhost ~]# echo ${sz1[@]}
1 2 3
【[]里的*和@都可以获取数据列表,但在加上引号后效果不一样。作用与预定义变量里的*和@一样】

获取数组长度

[root@localhost ~]# length=${#sz[*]}   
[root@localhost ~]# echo $length
5
[root@localhost ~]# sz1=(1 2 3)
[root@localhost ~]# length=${#sz1[@]}
[root@localhost ~]# echo $length
3
【在获取数据列表的表达式里添加#即可】

读取数组中某下标赋值及数组遍历

读取数组中某下标赋值

[root@localhost ~]# xb=${sz1[2]}           【将数组sz1里索引2的值赋值变量xb】
[root@localhost ~]# echo $xb
3
[root@localhost ~]# xb=${sz1[0]}
[root@localhost ~]# echo $xb
1

数组遍历

[root@localhost ~]# echo ${sz2[@]}
20 30 40 10 50
[root@localhost ~]# for w in ${sz2[@]}        【将数组sz2的值赋给w并通过for循环进行遍历】
> do
> echo $w
> done
20
30
40
10
50
【也可写进/bin/bash脚本内】

数组切片、替换及删除

数组切片

[root@localhost ~]# sz2[5]="40"
[root@localhost ~]# sz2[6]="30"
[root@localhost ~]# sz2[7]="70"
[root@localhost ~]# echo ${sz2[@]}
20 30 40 10 50 40 30 70
[root@localhost ~]# echo ${sz2[@]:2:4}   
【第一个:是切片的起始索引位置,第二个:是往后输出的几个索引长度】
40 10 50 40
[root@localhost ~]# echo ${sz2[@]:1:4}
30 40 10 50
[root@localhost ~]# echo ${sz2[@]:3:5}
10 50 40 30 70
【因为索引3再往后的第5个索引位置没有值,所以只输出索引3后面的4个索引的值】
[root@localhost ~]# echo ${sz2[@]:3:2}
10 50

数组替换

[root@localhost ~]# echo ${sz2[@]}
20 30 40 10 50 40 30 70
[root@localhost ~]# echo ${sz2[@]/3/15}       【将数组sz2内查找到的所有字符3替换成字符15】
20 150 40 10 50 40 150 70
[root@localhost ~]# echo ${sz2[@]}            【因为此替换方式为临时替换,所以再次查看数组sz2的值仍为原有值】
20 30 40 10 50 40 30 70
[root@localhost ~]# sz2=(${sz2[@]/0/1})       【可通过重新赋值数组sz2的方式达到永久替换的目的】
[root@localhost ~]# echo ${sz2[@]}
21 31 41 11 51 41 31 71
[root@localhost ~]# sz2=(${sz2[@]/1/5})
[root@localhost ~]# echo ${sz2[@]}
25 35 45 51 55 45 35 75

数组删除

[root@localhost ~]# echo ${sz[@]}
20 30 40 10 50
[root@localhost ~]# unset sz         【删除整个数组】
[root@localhost ~]# echo ${sz[@]}


[root@localhost ~]# echo ${sz2[@]} 
25 35 45 51 55 45 35 75
[root@localhost ~]# unset sz2[3]    【删除该数组中的某个元素】
[root@localhost ~]# echo ${sz2[@]}
25 35 45 55 45 35 75
[root@localhost ~]# unset sz2[5]  
【删除该数组中的某个元素,因为是通过索引删除的,而索引的值是固定的,所以这里删除的是起始赋值时索引5的值“45”,而不是刚才删除某个值
后的数组中的“35”】
[root@localhost ~]# echo ${sz2[@]}
25 35 45 55 35 75

数组追加元素

方式一

[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50
[root@localhost ~]# sz3[5]=11                 【在数组sz3中的索引5位置追加元素11】
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 11
[root@localhost ~]# sz3[6]=87                 【在数组sz3中的索引6位置追加元素87】
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 11 87

方式二

[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 11 87
[root@localhost ~]# sz3[${#sz3[@]}]=90       
【获取数组sz3的长度并用$获值,也就等于数组名+索引的方式。因为获取长度是包含索引0,所以长度的数大于索引数】
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 11 87 90
[root@localhost ~]# sz3[${#sz3[@]}]=111
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 11 87 90 111


【但如果删除一个索引或者漏赋一个索引的值则无法使用该方式,因为届时长度比索引数大1的等式不成立】
[root@localhost ~]# unset sz3[5]
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 87 90 111
[root@localhost ~]# sz3[${#sz3[@]}]=120
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 87 90 120
[root@localhost ~]# sz3[${#sz3[@]}]=9
[root@localhost ~]# echo ${sz3[@]}
20 30 40 10 50 87 90 9

方式三

  •  引号不能省略,因为 * 和 @ 在不加双引号时表现一致,但是如果加了双引号,* 则会将所有元素作为一个整体,@则把各个元素分隔成n份的元素列表,每个元素视为一个字符串

[root@localhost ~]# sz4=(10 11 12 13)
[root@localhost ~]# echo ${sz4[@]}
10 11 12 13
[root@localhost ~]# sz4=("${sz4[@]}"1 2)
【用双引号加@,表示在数组sz4后单独添加元素1和元素2,但因为没有加空格,所以元素1将与元素13合并】
[root@localhost ~]# echo ${sz4[@]}
10 11 12 131 2
[root@localhost ~]# echo ${#sz4[@]}
5
【因为没加空格,所以元素1将与元素13合并,故而长度为5】
[root@localhost ~]# sz4=("${sz4[@]}" 10 20)
[root@localhost ~]# echo ${sz4[@]}
10 11 12 131 2 10 20
【因为加了空格,所以元素10和元素20单独添加在元素2之后】
[root@localhost ~]# echo ${#sz4[@]}
7
【故而长度为7】
[root@localhost ~]# sz4=("${sz4[*]}" 10 20)
[root@localhost ~]# echo ${sz4[@]}
10 11 12 131 2 10 20 10 20
[root@localhost ~]# echo ${#sz4[@]}
3
【因为使用的是*所以把数组sz4里面的元素当作一个整体,故而长度为3】
[root@localhost ~]# sz4=("${sz4[*]}" 10 20 30 40)
[root@localhost ~]# echo ${sz4[@]}
10 11 12 131 2 10 20 10 20 10 20 30 40
[root@localhost ~]# echo ${#sz4[@]}
5
【因为使用的是*所以把数组sz4里面的元素当作一个整体,故而长度为5】

方式四

  •  此方式是在数组原有的元素后面进行追加操作
  •  待添加元素必须用()括起来,并且多个元素需用空格进行分隔

[root@localhost ~]# sz4=(10 11 20 21)
[root@localhost ~]# echo ${sz4[@]}
10 11 20 21
[root@localhost ~]# sz4+=(100 200 300)
[root@localhost ~]# echo ${sz4[@]}
10 11 20 21 100 200 300
[root@localhost ~]# echo ${#sz4[@]}
7

数组传参

将数组的参数传参到函数内

  •  如果将数组变量作为函数参数,函数只会取数组变量的第一个值,所以如果想把数组传参到函数中,不能使用位置变量,必须将数组打散后再传参进函数进行重组成数组

[root@localhost ~]# ./26.sh 
原始的数组值为:30 20 10 40 50
接收到的数组参数列表:30
新的数组值为:30
[root@localhost ~]# vim 26.sh
#!/bin/bash
mfj() {
  echo "接收到的数组参数列表:$@"
  mfj1=($1)
  echo "新的数组值为:${mfj1[@]}"
}
sz5=(30 20 10 40 50)
echo "原始的数组值为:${sz5[@]}"
mfj $sz5

  •  解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。再在函数内部将所有的参数重新组合成一个新的数组变量

方式一

[root@localhost ~]# ./26.sh 
原始的数组值为:30 20 10 40 50
接收到的数组参数列表:30 20 10 40 50
新的数组值为:30 20 10 40 50
[root@localhost ~]# vim 26.sh

#!/bin/bash
mfj() {
  echo "接收到的数组参数列表:$@"
【@代表从数组sz5里获取的数据列表】
  mfj1=(`echo $@`)                 
【提取获得到的数组列表值,并赋值给新数组mfj1】
  echo "新的数组值为:${mfj1[@]}"

}

sz5=(30 20 10 40 50)
echo "原始的数组值为:${sz5[@]}"
mfj ${sz5[@]}
【将获取到的数组sz5的数据列表分别传参到函数mfj里】

方式二

[root@localhost ~]# ./26-1.sh 
初始数组的值为:30 20 10 40 50
接收到的函数值为:30 20 10 40 50
新的数组值为:30 20 10 40 50
[root@localhost ~]# vim 26-1.sh

#!/bin/bash
mfj() {
   echo "接收到的函数值为:$@"
   sz1=($@)                          
【与方式一的区别在于这里不是通过反撇号提取echo值,而是直接将接受到的个体值赋给数组sz1。因为这里是通过"@"将个体参数传参进函数,所以如果
不用$@,而使用位置参数$1则只显示位置1的数值。】
   echo "新的数组值为:${sz1[@]}"

}

sz=(30 20 10 40 50)
echo "初始数组的值为:${sz[@]}"

mfj ${sz[@]}

方式三

  •  与方式二的区别在于函数内重组成数组时不直接使用获得的$@值,而是直接把每个位置参数的值都获取一遍

[root@localhost ~]# ./26-2.sh 
初始数组的值为:30 20 10 40 50
接收到的函数值为:30 20 10 40 50
新的数组值为:30 20 10 40
[root@localhost ~]# vim 26-2.sh

#!/bin/bash
mfj() {
   echo "接收到的函数值为:$@"
   sz1=($1 $2 $3 $4)
   echo "新的数组值为:${sz1[@]}"

}

sz=(30 20 10 40 50)
echo "初始数组的值为:${sz[@]}"

mfj ${sz[@]}

将函数里的值返回到数组

方式一

  •  将一个数组的值打散传参到函数里,并将各个元素累计相加操作后的结果返回并重组数组

[root@localhost ~]# ./27.sh 
原数组的值为 100 200 300 400 500
函数中新数组所有元素的累计和为:1500
[root@localhost ~]# vim 27.sh

#!/bin/bash
mfj() {
  newsz=($@)                    【通过$@获取函数外打散后的列表值,并赋给一个新数组newsz。这里的($@)与`echo $@`一样】

  sum=0
  for w in ${newsz[@]}          【取数组newsz中所有元素的值进行求和操作 】
  do
    sum=$[$sum+$w]              【求和操作】
  done
  echo $sum

}

sz=(100 200 300 400 500)
echo "原数组的值为 ${sz[@]}"
mfj1=$(mfj ${sz[@]})      
【先将数组sz打散成一个列表,然后交给函数mfj去处理,并将函数mfj处理后的结果赋给mfj1】
echo "函数中新数组所有元素的累计和为:$mfj1"

方式二

  •  将一个数组的值打散传参到函数里,并将*2操作后的结果返回并重组数组

[root@localhost ~]# ./27-1.sh 
原数组的值为:15 30 45 60
新数组的值为:30 60 90 120
[root@localhost ~]# vim 27-1.sh

#!/bin/bash
mfj() {
  newsz=($@)                                【将函数获取到的列表数值重新赋给数组newsz】
  for ((w=0;w<${#newsz[@]};w++))            【因为用的是小于操作,所以直接小于函数长度即可】
  do 
    newsz[$w]=$[${newsz[$w]} * 2]
【获取数组newsz中每个元素对应的值并进行*2操作。并将操作的结果重新赋值给数组newsz的索引对应的元素】 
  done
  echo ${newsz[@]}
}

sz=(15 30 45 60)
echo "原数组的值为:${sz[@]}"

sz2=(`mfj ${sz[@]}`)          
【提取函数mfj使用数组sz打散后的数据列表作为参数后执行的结果,并定义给新数组sz2】
echo "新数组的值为:${sz2[@]}"                【提取新数组sz2的数据列表值并输出】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值