数组的定义和遍历,下标数组的遍历方法

文章目录

  • 数组使用说明
  • 数组的定义
    • 定义固定参数和取值
      • 方法1
      • 方法2
      • 方法3
    • 数组的赋值
    • 把文件中的值定义数组
    • 数组的删除
    • 数组内容截取
    • 数组内容替换
  • 普通数组的遍历
    • 遍历固定值数组
      • for 遍历
        • 方式1:
        • 方式二:
      • until遍历
      • while遍历
        • 方式1
        • 方式二
  • 数组下标遍历
    • 需求
    • 代码和执行结果

数组使用说明

echo ${array1[0]}访问数组中的第一个元数
echo ${array1[@]}访问数组中所有元数 等同于 echo ${array1[*]}
echo ${#array1[@]}统计数组元素的个数
echo ${!array2[@]}获取数组元素的索引
echo ${array1[@]:1}从数组下标1开始
echo ${array1[@]:1:2}从数组下标1开始,访问两个元素

数组的定义

定义固定参数和取值

取值打印需要用{}括起来,其中[ ]中放的是需要取的值;
*@均为打印所有参数;
数组从0开始取值,也就是说数组中0代表获取第一个参数,1代表获取第二个参数,一次类推。

方法1

[root@controller array]# 
[root@controller array]# cat array1.sh 
array=(1 two 3 )
#数组取值第一个参数默认从0开始
# echo "print1:$array0"也可以取到单个值,但不建议用这么不标准的用法。
echo "print1:${array[0]}"
echo "print2:${array[1]}"
echo "print3:${array[2]}"
echo "print all:${array[*]}"
[root@controller array]# 
[root@controller array]# sh array1.sh  
print1:1
print2:two
print3:3
print all:1 two 3
[root@controller array]# 

方法2

[root@controller array]# cat array2.sh
array=([1]=one [2]=2 [3]=three)
#数组取值第一个参数默认从0开始
# echo "print1:$array0"也可以取到单个值,但不建议用这么不标准的用法。
echo "print1:${array[0]}"
echo "print2:${array[1]}"
echo "print3:${array[2]}"
echo "print all:${array[*]}"
[root@controller array]# 
[root@controller array]# sh array2.sh
print1:
print2:one
print3:2
print all:one 2 three
[root@controller array]# 

方法3

[root@controller array]# 
[root@controller array]# cat array3.sh
array[0]=1
array[1]=two
array[2]=3
array[4]=5# 我跳过了array[3],所以执行结果中array[3]并取不到任何参数
# echo "print1:$array0"也可以取到单个值,但不建议用这么不标准的用法。
echo "print1:${array[0]}"
echo "print2:${array[1]}"
echo "print3:${array[2]}"
echo "print4:${array[3]}"
echo "print5:${array[4]}"
echo "print all:${array[*]}"
[root@controller array]# 
[root@controller array]# sh array3.sh
print1:1
print2:two
print3:3
print4:
print5:5
print all:1 two 3 5
[root@controller array]# 

数组的赋值

特别说明,如果下标不存在,则自动添加一个新的为空元素,如果下标存在,则会覆盖之前的内容,如下面,我先定义了array[2]=2,后面又定义了一次array[2]=two,所以取值的时候下标就被覆盖为我后面定义的值。

[root@controller array]# 
[root@controller array]# cat array4.sh
array[1]=one
array[2]=2
array[3]=three
#注,我之前已经把[2]赋值为2了,下面为重新把[2]赋值为two
array[2]=twoecho "print2:${array[1]}"
echo "print all:${array[*]}"
[root@controller array]# 
[root@controller array]# sh array4.sh
print2:one
print all:one two three
[root@controller array]# 

把文件中的值定义数组

定义数组的方法有两种,可以先定义为一个变量,也可以不用定义为变量,如下脚本中的array1和array2,需要注意的是,如果需要一个一个获取文件中的内容,就需要用for遍历(下面会说)。

[root@controller array]# 
[root@controller array]# cat array5.sh
su=`cat /root/ccx/array/array.txt`
array1=($su)
echo "array2:${array1[1]}"
echo "array all:${array1[*]}"
echo "____________________________"array2=(`cat /root/ccx/array/array.txt`)
echo "array2:${array2[1]}"
echo "array all:${array2[*]}"
[root@controller array]# cat array.txt 
1
two
3
four
[root@controller array]# sh array5.sh 
array2:two
array all:1 two 3 four
____________________________
array2:two
array all:1 two 3 four
[root@controller array]#

数组的删除

删除数组的命令是unset,需要注意,第一个值是从0开始的。

[root@controller array]# 
[root@controller array]# cat array6.sh
array=(1 2 3 4 5)
echo "删除前:${array[*]}"
unset array[1]
echo "删除第二个值后:${array[*]}"
[root@controller array]# 
[root@controller array]# sh array6.sh 
删除前:1 2 3 4 5
删除第二个值后:1 3 4 5
[root@controller array]# 

数组内容截取

格式为读取后面加:,然后后面是截取的起始值和末尾值,中间以:隔开。

[root@controller array]# cat array7.sh
array1=(1 2 3 4 5 6)
echo  "array1 all:${array1[*]}"
echo  "array1 1-3:${array1[*]:1:3}"array2=($(echo {a..z}))
echo "array2 all:${array2[*]}"
echo "array2 1-3:${array2[*]:1:3}"[root@controller array]# sh array7.sh
array1 all:1 2 3 4 5 6
array1 1-3:2 3 4
array2 all:a b c d e f g h i j k l m n o p q r s t u v w x y z
array2 1-3:b c d
[root@controller array]# 

数组内容替换

格式为读取后面加/,然后后面是需要替换的内容和替换后的内容,中间以/隔开。

[root@controller array]# cat array7.sh
array=(1 2 3 4 5)
echo "array all:${array[*]}"
echo "把3替换为three:${array[*]/3/three}"
[root@controller array]# sh array7.sh
array all:1 2 3 4 5
把3替换为three:1 2 three 4 5
[root@controller array]#

普通数组的遍历

遍历固定值数组

for 遍历

方式1:

[root@controller array]# cat array1.sh
arr=(2020 09 15 'hero' 'ccx')
length=${#arr}
echo "arr length is : $length"# for
for i in ${arr[*]} ; doecho $i
done
[root@controller array]# 
[root@controller array]# sh array1.sh
arr length is : 4
2020
09
15
hero
ccx
[root@controller array]# 

方式二:

[root@controller array]# 
[root@controller array]# cat array1.sh
arr=(2020 09 15 'hero' 'ccx')
length=${#arr}
echo "arr length is : $length"# for
#for i in ${arr[*]} ; do
#       echo $i
#donefor ((k=0; k <= $length; k++)) ; doecho ${arr[$k]}
done[root@controller array]# 
[root@controller array]# sh array1.sh
arr length is : 4
2020
09
15
hero
ccx
[root@controller array]# 

until遍历

[root@controller array]# cat array1.sh
arr=(2020 09 15 'hero' 'ccx')
length=${#arr}
echo "arr length is : $length"#until
until (( i++ > $length)) ; doecho ${arr[((i-1))]}
done[root@controller array]# sh array1.sh
arr length is : 4
2020
09
15
hero
ccx
[root@controller array]#

while遍历

方式1

[root@controller array]# cat array1.sh
arr=(2020 09 15 'hero' 'ccx')
length=${#arr}
echo "arr length is : $length"while (( i++ <= $length )) ; doecho ${arr[((i-1))]}
done[root@controller array]# sh array1.sh
arr length is : 4
2020
09
15
hero
ccx
[root@controller array]#  

方式二

[root@controller array]# cat hosts 
2020
09
15
heroccx
[root@controller array]# cat array1.sh 
while read a ; dohosts[++i]=$aecho $a
done < /root/ccx/array/hosts
[root@controller array]# sh array1.sh 
arr length is : 4
2020
09
15
heroccx
[root@controller array]# 

数组下标遍历

平常使用的话就是数组遍历就足够了,用到下标遍历主要用途是 需要同时显示两个文件甚至更多的文件内容才需要使用到下标遍历。
我这里使用下标遍历2个文件中的内容为例。

需求

我这里有2个文件中有值,我需要打印文件1中的全部,然后把文件2中的一部分放在文件1的后面打印出来。
2个文件如下:

[root@controller array]# cat uuid.log 
instance-00000031 5625a723-9fa3-4199-bfc4-ff547a74f1fd
instance-0000038e f7f29efe-d8c0-403a-985c-9addb627f47f
instance-000004a8 8c063c19-9736-4a65-8ea0-70285dd433fe
instance-000004d8 4b6ce74a-2921-4854-84f4-c47a4faa905f
instance-00000629 5e384851-b52e-4f6d-9c5f-9c13027d0221
instance-000004e4 99e5410e-1f77-491c-9f26-2b77d190efaa
instance-000006cf 15482f54-8469-445c-b5fe-da816b92f112
instance-00000632 a379c9a4-7994-4061-9ff7-b386a1b82220
instance-0000009a 79f90392-ca7c-4fbb-8548-bb0ed4f6f361
[root@controller array]# cat name.log 
d3bece79-022d-4b36-9ccf-8027de3fcba0 10.233.168.16
954b4819-4ad8-4c24-9537-8843a21e8a72 10.233.168.12
0fd9f48c-0083-4461-96da-c8d4e1540411 10.233.168.13
4596d36f-4912-4e5a-8c53-b53bb6fc5996 10.237.96.11
0dfcb32e-6e5f-4f60-8844-402aac308d39 10.237.96.18
55a46086-c211-492f-9c72-74ee7f3c518e 10.237.96.35
5625a723-9fa3-4199-bfc4-ff547a74f1fd 10.233.166.6
f7f29efe-d8c0-403a-985c-9addb627f47f 10.237.96.231
8c063c19-9736-4a65-8ea0-70285dd433fe 10.237.96.129
4b6ce74a-2921-4854-84f4-c47a4faa905f 10.237.96.145
5e384851-b52e-4f6d-9c5f-9c13027d0221 10.233.168.60
99e5410e-1f77-491c-9f26-2b77d190efaa 10.237.96.149
[root@controller array]# 

就是说,我想把name.log中的ip对应放到uuid.log中的后面,如下
在这里插入图片描述

代码和执行结果

[root@controller array]# cat array.sh 
#!/bin/bashii=0
while read line ; do array1[$ii]=$linelet ii++
done < uuid.logjj=0
for j in $(cat name.log | awk '{print $2}') ; doarray2[$jj]=$jlet jj++
done#获取数组元素的个数
sum=${#array1[@]}
for ((kk=0; kk<$sum; kk++)) ; doecho ${array1[$kk]} ${array2[$kk]}
done
[root@controller array]# 
[root@controller array]# sh array.sh
instance-00000031 5625a723-9fa3-4199-bfc4-ff547a74f1fd 10.233.168.16
instance-0000038e f7f29efe-d8c0-403a-985c-9addb627f47f 10.233.168.12
instance-000004a8 8c063c19-9736-4a65-8ea0-70285dd433fe 10.233.168.13
instance-000004d8 4b6ce74a-2921-4854-84f4-c47a4faa905f 10.237.96.11
instance-00000629 5e384851-b52e-4f6d-9c5f-9c13027d0221 10.237.96.18
instance-000004e4 99e5410e-1f77-491c-9f26-2b77d190efaa 10.237.96.35
instance-000006cf 15482f54-8469-445c-b5fe-da816b92f112 10.233.166.6
instance-00000632 a379c9a4-7994-4061-9ff7-b386a1b82220 10.237.96.231
instance-0000009a 79f90392-ca7c-4fbb-8548-bb0ed4f6f361 10.237.96.129
[root@controller array]# 

需要注意的是,如果需要获取一个文件中的全部值,必须要使用 while 遍历,否则就会出现下标读取混乱。如果值获取一个值,可以用for循环过滤。
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部