shell编程之数组
1.什么是数组?
Shell的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。
有了Shell数组后,就可以用相同名字引用一系列变量及变量值,并通过数字(索引)来识别使用它们。在许多场合,使用数组可以缩短和简化程序开发。
数组的本质还是变量,是特殊的变量形式
2.数组的操作
2.1 数组的定义
方法一:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔
array=(value1 value2 value3 ... )
示例:
array=(1 2 3) #<==用小括号将数组内容赋值给数组变量,数组元素用“空格”分隔开。
echo ${array[*]} #<==输出上面定义的数组的所有元素值,注意语法。
方法二:用小括号将变量值括起来,同时采用键值对的形式赋值
array=([0]=one [1]=two [3]=three [4]=four)
方法三:通过分别定义数组变量的方法来定义
[root@ci-node1 work]# arry[0]=one
[root@ci-node1 work]# arry[1]=two
[root@ci-node1 work]# arry[2]=three
[root@ci-node1 work]# arry[3]=four
[root@ci-node1 work]# echo ${arry[@]} #查看所有数组的值
one two three four
方法四:动态地定义数组变量,并使用命令的输出结果作为数组的内容
array=($(命令))
array=(`命令`)
示例:
[root@ci-node1 work]# arry=(`ls ./`)
[root@ci-node1 work]# echo ${arry[@]}
10.sh 172.16.1.7 1.sh 2.sh 3.sh 4.sh 5.sh 6.sh 7.sh 8.sh access_2010-12-8.log rsync.sh
2.2 数组的打印
array=(one two three)
echo ${array[0]} #<==打印单个数组元素用${数组名[下标]},当未指定数组下标时,数组的下标是从0开始。
one
echo ${array[1]}
two
echo ${array[2]}
three
echo ${array[*]} #<==使用*或者@可以得到整个数组内容。
one two three
echo ${array[@]} #<==使用*或者@可以得到整个数组内容。
one two three
2.2.1 打印数组元素的个数
echo ${array[*]} #<==使用*或者@可以得到整个数组内容。
one two three
echo ${#array[*]} #<==用${#数组名[@或*]}可以得到数组长度,这和前文讲解的变量子串知识是一样的,因为数组也是变量,只不过是特殊的变量,因此也适合变量的子串替换等知识。
3
echo ${array[@]} #<==使用*或者@可以得到整个数组内容。
one two three
echo ${#array[@]} #<==用${#数组名[@或*]}可以得到数组长度
3
2.3 数组赋值
直接通过“数组名[下标] ”对数组进行引用赋值,如果下标不存在,自动添加新一个数组元素,如果下标存在就覆盖原来的值
[root@ci-node1 work]# array=(one two three)
[root@ci-node1 work]# echo ${array[*]}
one two three
[root@ci-node1 work]# array[3]=four #<==增加下标为3的数组元素
[root@ci-node1 work]# echo ${array[*]}
one two three four
[root@ci-node1 work]# array[0]=oldboy #<==修改数组元素
[root@ci-node1 work]# echo ${array[*]}
oldboy two three four
2.4 数组的删除
因为数组本质上还是变量,因此可通过“unset 数组[下标]”清除相应的数组元素,如果不带下标,表示清除整个数组的所有数据
[root@ci-node1 work]# echo ${array[*]}
oldboy two three four
[root@ci-node1 work]# unset array[1] #<==取消下标为1的数组元素
[root@ci-node1 work]# echo ${array[*]} #<==打印输出后发现数组元素“two”,不见了
oldboy three four
[root@ci-node1 work]# unset array #<==删除整个数组
[root@ci-node1 work]# echo ${array[*]}
#<==没有任何内容了。
[root@ci-node1 work]#
2.5 数组的截取与替换
截取
[root@ci-node1 ~]# arrary=(1 2 3 4 5)
[root@ci-node1 ~]# echo ${arrary[@]:1:3 } #<==从下标为1的元素开始截取,共取3个数组元素
2 3 4
[root@ci-node1 ~]# arrary=({a..z})
[root@ci-node1 ~]# echo ${arrary[@]}
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
[root@ci-node1 ~]# echo ${arrary[@]:3:3} #<==从下标为1的元素开始截取,共取3个数组元素。
d e f
[root@ci-node1 ~]# echo ${arrary[@]:0:3} #<==从下标为0的元素开始截取,共取3个数组元素
a b c
替换
[root@ci-node1 ~]# arrary=(1 2 3 4)
[root@ci-node1 ~]# echo ${arrary[@]}
1 2 3 4
[root@ci-node1 ~]# echo ${arrary[@]/2/oldoby} #<==把数组中的1替换成b,原数组未被修改,和sed很像。
1 oldoby 3 4
删除
array=(one two three four five)
echo ${array[@]}
one two three four five
echo ${array[@]#o*} #<==从左边开始匹配最短的,并删除。
ne two three four five
echo ${array1[@]##o*} #<==从左边开始匹配最长的,并删除。
two three four five
echo ${array[@]%f*} #<==从右边开始匹配最短的,并删除。
one two three
echo ${array[@]%%f*} #<==从右边开始匹配最长的,并删除。
one two three
3.Shell数组脚本开发实践
3.1 使用循环批量输出数组的元素
[root@ci-node1 scripts]# cat 15.sh
#!/bin/bash
##############################################################
# File Name: 15.sh
# Version: V1.0
# Author: liu
# Organization:
# Created Time : 2019-04-15 21:40:02
# Description:
##############################################################
#普通方式
arrary=(1 2 3 4 5)
for i in ${arrary[@]}
do
echo $i
done
#c语言方式
arrary1=(1 2 3 4 5)
for ((i=0;i<${#arrary1[@]};i++)) #<==从数组的第一个小标0开始,循环数组的所有下标
do
echo ${arrary1[i]} #<==打印数组元素
done
#while循环打印
arrary2=(1 2 3 4 5)
i=0
while ((i<${#arrary2[@]}))
do
echo ${arrary2[i]}
((i++))
done
3.2 通过竖向列举法定义数组元素并批量打印。
[root@ci-node1 scripts]# cat 16.sh
#!/bin/bash
##############################################################
# File Name: 16.sh
# Version: V1.0
# Author: liu
# Organization:
# Created Time : 2019-04-15 21:54:12
# Description:
##############################################################
arrary=(
oldboy
oldgirl
xiaoting
binggin
)
for ((i=0;i<${#arrary[*]};i++))
do
echo "This is num $i,then content is ${arrary[i]}"
done
3.3 把命令结果作为数组元素定义并打印
[root@ci-node1 scripts]# cat 17.sh
#!/bin/bash
##############################################################
# File Name: 17.sh
# Version: V1.0
# Author: liu
# Organization:
# Created Time : 2019-04-15 21:58:58
# Description:
#############################################################
arrary=(`ls /oldboy`)
for ((i=0;i<${#arrary[*]};i++))
do
echo "This is num $i,then content is ${arrary[i]}"
done
echo --------------------
arrary1=($(ls /oldboy))
num=0
for i in ${arrary1[*]}
do
echo "This is num $num,then content is $i"
((num++))
done
4.shell数组命令总结
1)定义命令
静态数组:
array=(1 2 3)
动态数组:
array=($(ls))或array=(`ls`)
给数组赋值:
array[3]=4
2)打印命令
打印所有元素:
${array[@]}或${array[*]}
打印数组长度:
${#array[@]}或${#array[*]}
打印单个元素:
${array[i]} #<==i是数组下标。
3)循环打印的常用基本循环
#!/bin/sh
arr=(
10.0.0.11
10.0.0.22
10.0.0.33
)
#C语言for循环语法
for ((i=0;i<${#arr[*]};i++))
do
echo "${arr[$i]}"
done
echo ---------------
#普通for循环语法
for n in ${arr[*]}
do
echo "$n"
done