shell编程之数组

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
原文地址:https://www.cnblogs.com/yjiu1990/p/10748237.html