bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。shell 下的多维数组是可以通过1维数组组合的,本篇也会在后面提到多维数据。

一、定义数组

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:

1array=(value1 value2 ...... valueN)             #从下标0开始依次赋值
2array=([1]=value1 [2]=value2 [0]=value0)        #指定下标赋值
3declare -a array=(value1 value2 ...... valueN)  #声明+赋值,也可以只声明
4unixtype=('Debian' 'Red Hat' 'Fedora')          #如果元素有空格,就要用引号
5set| grep array                                 #利用set查看数组赋值情况

除此之外也可以通过read的交互的方式定义数组。如下:

1# read -a array                  #-a表示从标准输入读入数组,遇到换行为止
21 2 3 4 5
3# echo "${array[@]}"
41 2 3 4 5

可以通过如下方法清除数组:

1unset array                     #清除数组
2unset array[1]                 #清除数组的指定元素 

示例:

1unixtype=('Debian' 'Red Hat' 'Fedora')
2各值单独定义
3NAME[0]="Zara"
4NAME[1]="Qadir"
5NAME[2]="Mahnaz"

二、数组变量

现网应用中经常需要获取元素的个数、下标值的情况,shell本身也提供了获取的方法。

 1# 取得数组元素的个数
 2length=${#array_name[@]}
 3# 或者
 4length=${#array_name[*]}
 5# 取得数组单个元素的长度
 6lengthn=${#array_name[n]}
 7#取得数组下标的值
 8${!array[@]}
 9#从数组的n位置开始取m个元素
10${array[@]:n:m}

示例如下:

 1[root@localhost ~]# unixtype=('Debian' 'Red Hat' 'Fedora')
 2[root@localhost ~]# echo ${#unixtype[@]}
 33
 4[root@localhost ~]# echo ${#unixtype[*]}
 53
 6[root@localhost ~]# echo ${#unixtype[1]}
 77
 8[root@localhost ~]# echo ${!unixtype[@]}
 90 1 2
10[root@localhost ~]# echo ${!unixtype[2]}
11               --> 无结果输出
12[root@localhost ~]# echo ${unixtype[@]:1:2}
13Red Hat Fedora
14[root@localhost ~]# echo ${unixtype[@]:1:3}
15Red Hat Fedora

注意${array[@]:n:m}的用法,后面的m当大于可取的范围时,是不会报错的。

三、数组的常用操作

1、命令执行结果放入数组

1[root@361way ~]# array=($(ls | grep '.sh'))
23[root@361way ~]# array=(`ls | grep '.sh'`)
4[root@361way ~]# echo ${array[@]}
511.sh a.sh b.sh del_log.sh getcoreinfo.sh ntp.sh read.sh rrs.sh script.sh

2、读入字符串,给数组赋值

1i=0
2n=5
3while [ "$i" -lt $n ] ; do                     #遍历5个输入
4  echo "Please input strings ... `expr $i + 1`"
5  read array[$i]                                #数组赋值
6  b=${array[$i]}
7  echo "$b"
8  i=`expr $i + 1`                              #i递增
9done

3、字符串的字母逐个放入数组并输出

 1# cat a2.sh
 2chars='abcdefghijklmnopqrstuvwxyz'
 3i=0
 4while [ $i -lt ${#chars} ] ; do    # ${#char}是字符串长度
 5   #echo ${chars:$i:1} $i
 6   array[$i]=${chars:$i:1}            #从$i取1个字节
 7   echo ${array[@]} $i
 8   #echo ${array[$i]} $i
 9   i=`expr $i + 1`
10done

执行测试的时候,可以试下将echo ${array[@]} 换做echo $array ,会发现输出会有不同的,默认echo $arry 输出的是下第一个元素,即下标为0的值。这点是和python里的数组不一样的。

4、判断一个变量是否在数组中

一个很简洁的写法是:

1echo ${array[@]} | grep -wq "${member}"
2  if [ $? -eq $SUCCESS ];then
3但是这会带来一个问题,如果array的元素里面带有空格,就会误认为是一个元素,因此遍历比较是更稳妥的选择。
4
5for i in ${array[@]};do
6   if [ "$i" = "${member}" ];then
7   ....
8   fi
9done

5、构建二维数组

1a=('1 2 3' '4 5 6' '7 8 9')             #赋值,每个元素中都有空格
2for i in ${a[@]} ; do
3   b=($i)                                    #赋值给b,这样b也是一个数组
4   for j in ${b[@]};do                  #相当于对二元数组操作
5   ......
6   done
7done

6、文件内容读入数组

1# cat /etc/shells | tr "\n" " " >/tmp/tmp.file                      #回车变空格
2# read -a array < /tmp/tmp.file                                       #读入数组
3# set| grep array
4array=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/dash")