十五、Shell之数组

一、什么是数组

简单地说,Shell的数组就是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来命名,然后用编号对它们进行区分。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。

二、数组的定义

 
方法1:小括号定义
[root@node1 ~]# array=(a1 a2 a3)
[root@node1 ~]# echo ${array[*]}
a1 a2 a3
[root@node1 ~]# echo ${array[@]}
a1 a2 a3

方法2:用小括号将变量值括起来,同时采用键值对的形式赋值。
[root@node1 ~]# array=([1]=one [2]=two [3]=three)
[root@node1 ~]# echo ${array[*]}
one two three

方法3:通过分别定义数组变量的方法来定义。
[root@node1 ~]# array[0]=a
[root@node1 ~]# array[1]=b
[root@node1 ~]# array[2]=c
[root@node1 ~]# echo ${array[*]}
a b c

方法4:动态地定义数组变量,并使用命令的输出结果作为数组的内容。
[root@node1 ~]# ls /tmp
501.html  502.html  503.html  king1.bin  king2.bin  king3.bin  king4.bin  king5.bin  king6.bin
[root@node1 ~]# array=($(ls /tmp))
[root@node1 ~]# echo ${array[*]}
501.html 502.html 503.html king1.bin king2.bin king3.bin king4.bin king5.bin king6.bin

三、数组的输出打印

1.打印数组元素

 
[root@node1 ~]# array=(a1 a2 a3)
[root@node1 ~]# echo ${array[0]}
a1
[root@node1 ~]# echo ${array[1]}
a2
[root@node1 ~]# echo ${array[2]}
a3
[root@node1 ~]# echo ${array[*]}   #使用@和*都可以得到全部的数组内容
a1 a2 a3

2.打印数组元素的个数

[root@node1 ~]# array=(a1 a2 a3)
[root@node1 ~]# echo ${array[*]}
a1 a2 a3
[root@node1 ~]# echo ${#array[*]}
3

3、数组赋值

 
方法1:小括号定义
[root@node1 ~]# array=(a1 a2 a3)
[root@node1 ~]# echo ${array[*]}
a1 a2 a3
[root@node1 ~]# echo ${array[@]}
a1 a2 a3

方法2:用小括号将变量值括起来,同时采用键值对的形式赋值。
[root@node1 ~]# array=([1]=one [2]=two [3]=three)
[root@node1 ~]# echo ${array[*]}
one two three

方法3:通过分别定义数组变量的方法来定义。
[root@node1 ~]# array[0]=a
[root@node1 ~]# array[1]=b
[root@node1 ~]# array[2]=c
[root@node1 ~]# echo ${array[*]}
a b c

方法4:动态地定义数组变量,并使用命令的输出结果作为数组的内容。
[root@node1 ~]# ls /tmp
501.html  502.html  503.html  king1.bin  king2.bin  king3.bin  king4.bin  king5.bin  king6.bin
[root@node1 ~]# array=($(ls /tmp))
[root@node1 ~]# echo ${array[*]}
501.html 502.html 503.html king1.bin king2.bin king3.bin king4.bin king5.bin king6.bin

4、数组的删除

数组本质上还是变量,因此可通过“unset数组[下标]”清除相应的数组元素,如果不带下标,则表示清除整个数组的所有数据。

[root@node1 ~]# array=(one two three four)
[root@node1 ~]# echo ${array[*]}
one two three four

1、取消下标为1的数组元素
[root@node1 ~]# echo ${array[1]}
two
[root@node1 ~]# unset array[1]
[root@node1 ~]# echo ${array[1]}

[root@node1 ~]# echo ${array[*]}
one three four
[root@node1 ~]# 

2、取消整个数组
[root@node1 ~]# unset array
[root@node1 ~]# echo ${array[*]}

[root@node1 ~]# 

3、从左边开始匹配最短的数组元素, 并删除。                                                  
[root@node1 ~]# array=(one two three four five)
[root@node1 ~]# echo ${array[*]}
one two three four five
[root@node1 ~]# echo ${array[*]#o*}
ne two three four five

4、左边开始匹配最长的数组元素,并删除。
[root@node1 ~]# array=(one two three four five)
[root@node1 ~]# echo ${array[*]##o*}
two three four five

5、右边开始匹配最短的数组元素,并删除。
[root@node1 ~]# array=(one two three four five)
[root@node1 ~]# echo ${array[*]}
one two three four five
[root@node1 ~]# echo ${array[*]%f*}
one two three

6、右边开始匹配最长的数组元素,并删除。
[root@node1 ~]# array=(one two three four five)
[root@node1 ~]# echo ${array[*]}
one two three four five
[root@node1 ~]# echo ${array[*]%%f*}
one two three

                                                      

5、数组内容的截取和替换

内容截取

[root@node1 ~]# array=($(echo {a..z}))
[root@node1 ~]# echo ${array[*]}
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

取下标1号到5号的数组元素
[root@node1 ~]# echo ${array[*]:1:5}
b c d e f

内容替换

[root@node1 ~]# array=(1 1 2 3 3)
[root@node1 ~]# echo ${array[*]}
1 1 2 3 3

把1替换成a
[root@node1 ~]# echo ${array[*]/1/a}
a a 2 3 3
[root@node1 ~]# echo ${array[*]}
1 1 2 3 3
#临时修改,原数组未被修改

#调用方法为${数组名[@或*]/查找字符/替换字符},该操作不会改变原先数组的内容,如果需要修改,可以重新定义数组。

四、实验案例

打印数组

 
#! /bin/bash
array=(a1 a2 a3)
for i in $(echo ${array[*]})
do
  echo $i
done

测试

[root@node1 scripts]# bash shuzu1.sh 
a1
a2
a3

 

posted @ 2020-10-15 19:56  yaowx  阅读(197)  评论(0编辑  收藏  举报