十五、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
[root@node1 ~]# array=(a1 a2 a3) [root@node1 ~]# echo ${array[*]} a1 a2 a3 [root@node1 ~]# echo ${#array[*]} 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
数组本质上还是变量,因此可通过“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
内容截取
[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
I have a dream so I study hard!!!